我想使用JS,Underscore或JQuery将2个哈希数组合并为1个新数组。
这两个数组的长度可能不同,合并将基于 id 属性。相同数组之间的散列可能没有相同的ID,例如:
arr1 id' s = [1,5]
arr2 id' s = [1,2]
以下是我的数组:
arr1 = [{
id: 1
name: 'fred'
},id: 5
name: 'alex'
}];
arr2 = [{
id: 1
wage: '300'
},{
id: 2
wage: '10'
}]
所以基于 id 属性,我应该得到以下内容:
arr3 = [{
id: 1
name: 'fred'
wage: '300'
},{
id: 2
wage: '10'
},{
id: 5
name: 'alex'
}]
我尝试使用Merging/extend javascript object arrays based on join of a key property in each,但如果数组长度不同,则无法正常工作。有什么帮助吗?
答案 0 :(得分:2)
您可以使用Object.assign
:
arr1 = [{ id: 1, name: 'fred' }];
arr2 = [
{ id: 1, wage: '300' },
{ id: 2, wage: '10' }
];
var result = [];
arr1.concat(arr2)
.forEach(item =>
result[item.id] =
Object.assign({}, result[item.id], item)
);
result = result.filter(r => r);
console.log(result)
答案 1 :(得分:1)
修改强>
如评论中所述,此解决方案不考虑通过ID进行匹配。要查看此操作,只需将{ id:7, name: 'wilma' }
添加到第一个数组。
我把它留在这里但是因为从示例数据或描述中不清楚这是OP的关键问题,尽管我也有部分错误。但是我会在那里发表评论,如果他说是我可以编辑或删除它,那么
jQuery.extend()
https://api.jquery.com/jquery.extend/
jQuery.extend([deep],target,object1 [,objectN])
传入额外的参数使其成为深度合并,即递归
https://jsfiddle.net/dabros/q0hhqbmf/
arr1 = [{
id: 1,
name: 'fred'
}];
arr2 = [{
id: 1,
wage: '300'
},{
id: 2,
wage: '10'
}]
arr3 = [];
// Use 2 extends, though $.merge(x,$.extend(y,z)) would work just as well in this case
$.extend(arr3, $.extend(true, arr1, arr2 ));
console.log(arr3);
答案 2 :(得分:0)
为什么不只是简单地迭代它们,并收集新数组?
<script src="https://raw.githubusercontent.com/lodash/lodash/4.13.1/dist/lodash.js"></script>
<script>
var arr1 = [
{
id: 1,
name: 'fred'
},
{
id: 5,
name: 'alex'
}
];
var arr2 = [
{
id: 1,
wage: '300'
},
{
id: 2,
wage: '10'
}
];
var a1, a2, arr3 = [], merged = [];
// finding intersection and merging
for(a1 = 0; a1 < arr1.length; a1++) {
for(a2 = 0; a2 < arr2.length; a2++) {
if(arr1[a1].id === arr2[a2].id) {
arr3.push(_.extend(arr1[a1], arr2[a2]));
merged.push(arr1[a1].id);
break
}
}
}
// finding non merged elements and adding
for(a1 = 0; a1 < arr1.length; a1++) {
if(merged.indexOf(arr1[a1].id) > -1) {
continue;
}
arr3.push(arr1[a1]);
}
// finding non merged elements and adding
for(a2 = 0; a2 < arr2.length; a2++) {
if(merged.indexOf(arr2[a2].id) > -1) {
continue;
}
arr3.push(arr2[a2]);
}
document.write(JSON.stringify(arr3));
</script>
&#13;