如何在一个数组中合并两个对象数组,给定的对象数组如下所示。
var arr1=[{key:2000,value:100},{key:2001,value:200},{key:3000,value:300}]
var arr2=[{key1:2000,value1:100},{key1:2001,value1:200},{key1:3000,value1:300}]
预期产出:
[
{
"key": 2000,
"value": 100,
"child": [
{
"key1": 2000,
"value1": 100
}
]
},
{
"key": 2001,
"value": 200,
"child": [
{
"key1": 2001,
"value1": 200
}
]
},
{
"key": 3000,
"value": 300,
"child": [
{
"key1": 3000,
"value1": 300
}
]
}
]
答案 0 :(得分:2)
更新:正如其他人提到的那样,你可以遍历第一个数组并将第二个数组的相应元素分配给第一个数组中相应对象的子属性,或者你可以使用Array.prototype.map
例如:
var newArray = arr1.map(function(cur, idx) {
cur.child = [arr2[idx]];
return cur;
});
应该注意的是,这(以及提到的其他解决方案)依赖于包含相同键的两个数组,并且它们都按对象键排序。
如果您不确定数组是否按键排序,则必须进行一些预处理。您可以先对两个数组进行排序(这仍然很脆弱,因为无法保证两个数组中的键是相同的),或者执行以下操作:
var secondGroupByKey = {};
for (var i=0; i<arr2.length; i++) {
secondGroupByKey[arr2[i].key1] = arr2[i];
}
然后你可以安全地说:
var key;
for (var j=0; j<arr1.length; j++) {
key = arr1[j].key;
if (secondGroupByKey[key] !== undefined) {
arr1[j].child = [secondGroupByKey[key]];
}
}
这种方法比依赖数组的顺序更安全,但它需要迭代两个数组而不是一个数组的成本。如果您在arr1
中找不到arr2
中没有的密钥,您也可能想要抛出异常或以另一种方式拯救。
答案 1 :(得分:1)
循环遍历第一个数组,并将第二个数组中的相应值分配给第一个数组的每个对象的child
。
for(var i = 0;i<arr1.length;i++){
arr1[i].child=[arr2[i]];
}
答案 2 :(得分:1)
arr2.forEach(function( obj, i ) {
arr1[ i ].child = [ obj ];
});
答案 3 :(得分:0)
如果我理解正确,你需要把数组B的第n个元素作为对象的'child'属性,在数组A上使用相同的索引;这是我的尝试:
function addChildren(master, child){
return master.map(function(elem, i){
elem.child = elem.child || [];
elem.child.push(child[i]);
return elem;
});
};