2016-03-08 104 views
2

我试图找到答案但未成功。如何将新阵列添加到另一个阵列的特定对象

JSON数据的样本,可以说将它命名为mainArray

[{ 
    "id": 4455, 
    "key1": 44, 
    "key2": 55 
}, 
{ 
    "id": 1122, 
    "key1": 11, 
    "key2": 22 
}] 

数据需要mainArray要添加的样品nestedArray:

[{ 
    "nestedkey0": 'Value0', 
    "nestedkey1": "Value1", 
    "nestedkey2": "Value2" 
}, 
{ 
    "nestedkey0": "Value3", 
    "nestedkey1": "Value4", 
    "nestedkey2": "Value5" 
}] 

我们必须检查“id”键(在mainArray)是否等于“specificId”变量:

var specificId = 4455; 

如果他们是平等的 - 我们需要添加nestedArraymainArray对象与对象列表中的新钥匙,所以返回的结果应该是这样的:

[{ 
    "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

我有一种感觉,应该不难,但我不是很有经验d以angularjs解决此任务。 非常感谢您的回答!

更新

在Plunker

更新代码尼娜肖尔茨(链接以上)

而且从另一种解决方案太平

的答案

http://jsbin.com/xaxagusuma/edit?html,js,console,output

感谢所有您的帮助!

+0

你有什么试图解决这个问题?向我们展示您尝试过的代码。 –

+1

我是angularjs和平面javascript的新成员,所以我试着在这里找到解决方案,但是我做不到。我也尝试过push()方法,但它增加了** nestedArray **,就像** mainArray **中的对象的兄弟一样。 – Vlad

回答

2

在普通的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>');

+2

非常感谢! – Vlad

0

正如你怀疑这不是很难。最难的部分是找到正确的对象来插入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; 
} 
+0

我试过在这里使用你的答案http://jsbin.com/xaxagusuma/edit?html,js,console,output,但它看起来像有一个语法错误。但我想你的解决方案也应该是正确的。 – Vlad

+0

谢谢,修复。 – Halcyon

+0

if(index!== null){mainArray [index] .newKey = nastedArray; }在您的代码中 - 获取specificId var的新键值。当我将specificId替换为var nastedArray时 - 它创建了所需的数组。 – Vlad

1

一种替代与Array.prototype.find

的find()方法在数组中返回一个值,如果阵列中的一个元件满足提供的测试功能。否则返回undefined。

(看看在compatibility table!)

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

+0

是的,它的支持有限,但可以通过页面上提到的polyfil绕开。然而,这只是另一种选择:) – Andreas

+1

解决一个问题的不同方法 - 这是一个研究新工具/ lang /等的完美方法... Tnx为您的解决方案,感谢您的帮助;) – Vlad

0

大约保持简单:)

for (var i = 0, i < mainArray.length; i++) { 
     if (mainArray[i].id === specificId) { 
      mainArray[i].newKey = nestedArray; 
      break; 
     } 
    } 

将在所有的浏览器是什么。

+0

Omg,它看起来非常好,简单)) – Vlad

相关问题