如何将新的数组添加到另一个数组中特定对象中

3
我尝试找到答案,但没有成功。
JSON数据的样本,假设它被命名为mainArray
[{
  "id": 4455,
  "key1": 44,
  "key2": 55
},
{
  "id": 1122,
  "key1": 11,
  "key2": 22
}]

需要将数据样本nestedArray添加到mainArray中:
[{
  "nestedkey0": 'Value0',
  "nestedkey1": "Value1",
  "nestedkey2": "Value2"
},
{
  "nestedkey0": "Value3",
  "nestedkey1": "Value4",
  "nestedkey2": "Value5"
}]

我们需要检查“mainArray”中的“id”键是否等于“specificId”变量:
 var specificId = 4455;

如果它们相等 - 我们需要将nestedArray作为一个新键和对象列表添加到mainArray的对象中,因此返回的结果应该如下所示:
[{
  "id": 4455,
  "newKey": [{
      "nestedkey0": 'Value0',
      "nestedkey1": "Value1",
      "nestedkey2": "Value2"
    },
    {
      "nestedkey0": "Value3",
      "nestedkey1": "Value4",
      "nestedkey2": "Value5"
    }];
  "key1": 44,
  "key2": 55
},
{
  "id": 1122,
  "key1": 11,
  "key2": 22
}];

这里是Plunker上的代码示例: https://plnkr.co/edit/YJ3lTbleKrBJBaJm7VwU?p=preview 我感觉这不应该很难,但我在angularjs方面经验不够,无法解决这个问题。 提前感谢您的回答!
更新
在Plunker中更新了代码,包括Nina Scholz的答案(链接在上面)和Halcyon的另一个解决方案。
感谢大家的帮助!

你尝试过什么来解决这个问题?展示一下你尝试过的代码。 - Soubhik Mondal
1
我是angularjs和纯javascript的新手,所以我尝试在这里找到解决方案,但是我找不到。我还尝试了push()方法,但它会将nestedArray添加为mainArray中对象的兄弟节点。 - Vlad
4个回答

3
在纯JavaScript中,您可以使用Array.prototype.some()进行迭代,因为可能会出现短路情况。

some()方法测试数组中是否有元素通过提供的函数实现的测试。

var mainArray = [{ "id": 4455, "key1": 44, "key2": 55 }, { "id": 1122, "key1": 11, "key2": 22 }],
    nastedArray = [{ "nastedkey0": 'Value0', "nastedkey1": "Value1", "nastedkey2": "Value2" }, { "nastedkey0": "Value3", "nastedkey1": "Value4", "nastedkey2": "Value5" }],
    specificId = 4455;

mainArray.some(function (a) {
    if (a.id === specificId) {
        a.newKey = nastedArray;
        return true;
    }
});

document.write('<pre>' + JSON.stringify(mainArray, 0, 4) + '</pre>');


1

正如你所猜测的那样,这并不难。最困难的部分是找到正确的对象来插入 nastedArray

var mainArray = [/**/];
var nastedArray = [/***/];
var index = null;
var specificId = 4455;
for (var i = 0; index === null, i < mainArray.length; i += 1) {
    if (mainArray[i].id === specificId) {
        index = i;
    }
}
if (index !== null) {
    mainArray[index].newKey = nastedArray;
}

我尝试使用您在此处提供的答案http://jsbin.com/xaxagusuma/edit?html,js,console,output,但似乎存在语法错误。但我猜您的解决方案也应该是正确的。 - Vlad
如果(index!== null){ mainArray [index] .newKey = nastedArray; }在您的代码中-新键获取特定Id变量的值。当我将specificId替换为nastedArray变量时,它创建了所需的数组。 - Vlad
我很想给你的解决方案投赞成票,但这是我在这里的第一个问题,所以我的声望不高 =)但是非常感谢你的帮助! - Vlad

1
什么样简单点呢 :)
    for (var i = 0, i < mainArray.length; i++) {
        if (mainArray[i].id === specificId) {
            mainArray[i].newKey = nestedArray;
            break;
        }
    }

会在所有浏览器中工作。

哇,看起来真的很好看,而且简单)) - Vlad

1

使用Array.prototype.find可以作为一种替代方案

如果数组中的某个元素满足提供的测试函数,则find()方法返回该值。否则返回undefined。

(请查看兼容性表!)

var mainArray = [{ "id": 4455, "key1": 44, "key2": 55 }, { "id": 1122, "key1": 11, "key2": 22 }],
    nastedArray = [{ "nastedkey0": 'Value0', "nastedkey1": "Value1", "nastedkey2": "Value2" }, { "nastedkey0": "Value3", "nastedkey1": "Value4", "nastedkey2": "Value5" }],
    specificId = 4455;


var item = mainArray.find(x => x.id === specificId);
if (item !== undefined) {
  item.newKey = nastedArray;
}

console.log(JSON.stringify(mainArray));


1
正如您建议的那样,我已经查看了兼容性表,看起来这种方法不受IE支持。不幸的是,它并不适合我。但无论如何,感谢您的回答! - Vlad
是的,它有限制的支持,但可以通过页面上提到的polyfil绕过。尽管如此,这只是另一种选择 :) - Andreas
1
解决问题的不同方法——这是学习新工具/语言等的完美方式。感谢您的解决方案,感谢您的帮助 ;) - Vlad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接