Javascript 合并对象数组

Javascript 合并对象数组,javascript,object,merge,Javascript,Object,Merge,好的,我有两个对象,我想合并,但想知道最好的方法是什么 obj1 = [ { id: 123, list: [ {id:1}, {id:2}, {id: 3} ] }, { id: 456 list: [ {id:99}, {id:98}, {id: 97} ] } ] obj1 = [ {

好的,我有两个对象,我想合并,但想知道最好的方法是什么

obj1 = [
         { 
           id: 123, 
           list: [ {id:1}, {id:2}, {id: 3} ]
         },
         {
           id: 456
           list: [ {id:99}, {id:98}, {id: 97} ]
         }
       ]


obj1 = [
         { 
           id: 123, 
           list: [ {id:1}, {id:4}, {id: 5} ]
         },
         {
           id: 456
           list: [ {id:99}, {id:100}, {id: 101} ]
         }
       ]
我希望能够调用类似于
merge(obj1,obj2)
的函数,结果如下所示:

resultObj = [
         { 
           id: 123, 
           list: [ {id:1}, {id:2}, {id:3}, {id:4}, {id: 5} ]
         },
         {
           id: 456
           list: [ {id:99}, {id:98}, {id:97}, {id:100}, {id: 101} ]
         }
       ]
您可以使用
forEach()

var obj1=[{“id”:123,“list”:[{“id”:1},{“id”:2},{“id”:3}]},{“id”:456,“list”:[{“id”:99},{“id”:98},{“id”:97}]
var obj2=[{“id”:123,“list”:[{“id”:1},{“id”:4},{“id”:5}]},{“id”:456,“list”:[{“id”:99},{“id”:100},{“id”:101}]
var结果=[]
var arr=[].concat(obj1、obj2)
arr.forEach(功能(e){
如果(!this[e.id])result.push(this[e.id]=e)
否则{
var=这个;
e、 list.forEach(函数(a){
var o=that[e.id].list.find(c=>a.id==c.id);
o?Object.assign(o,a):该[e.id].list.push(a)
})
}
}, {})    

log(result)
您可以为相同的
id
属性使用嵌套哈希表。此解决方案复制对象中的所有属性

函数合并(源、目标、哈希){
source.forEach(函数(o){
如果(!哈希[o.id]){
hash[o.id]={{}:Object.create(null),数据:{id:o.id};
push(hash[o.id].data);
}
Object.keys(o).forEach(函数(k){
如果(['id','list'].indexOf(k)!=-1){
返回;
}
散列[o.id]。数据[k]=o[k];
});
如果(o.list){
hash[o.id].data.list=hash[o.id].data.list | |[];
合并(o.list,散列[o.id]。data.list,散列[o.id]。\ux);
}
});
}
var array1=[{id:123,列表:[{id:1,a:3},{id:2},{id:3}]},{id:456,列表:[{id:99},{id:98},{id:97}]},
array2=[{id:123,list:[{id:1,b:4},{id:4},{id:5}]},{id:456,list:[{id:99},{id:100},{id:101}],
hash=Object.create(null),
结果=[];
[array1,array2].forEach(函数(a){
合并(a、结果、散列);
});
控制台日志(结果)

。作为控制台包装{max height:100%!important;top:0;}
那么,您尝试了什么?您已经尝试了什么吗?实际上,这只是使用一些非常标准的循环或数组操作的问题,例如
array#forEach
array#filter
,等等。@t.niese no,这不是同一件事。@CengizAraz我在你写评论的同时删除了重复投票。我已经用循环的标准方式做到了,但认为可能有一种新的方式(es6),但看起来不像