Javascript 如何按键合并两个对象数组,并在单个对象数组中保留唯一的键?
我想合并两个对象数组,其中具有相同ID的对象将合并属性,具有唯一ID的对象将成为合并数组中自己的对象。下面的代码完成了第一部分,类似的ID将合并,但是如何在合并的数组中保留arr2中具有唯一ID的对象,并使其与不同长度的数组一起工作 预期产出:Javascript 如何按键合并两个对象数组,并在单个对象数组中保留唯一的键?,javascript,Javascript,我想合并两个对象数组,其中具有相同ID的对象将合并属性,具有唯一ID的对象将成为合并数组中自己的对象。下面的代码完成了第一部分,类似的ID将合并,但是如何在合并的数组中保留arr2中具有唯一ID的对象,并使其与不同长度的数组一起工作 预期产出: [ { "id": "1", "date": "2017-01-24", "name": "test"
[
{
"id": "1",
"date": "2017-01-24",
"name": "test"
},
{
"id": "2",
"date": "2017-01-22",
"bar": "foo"
}
{ "id": "3",
"foo": "bar",
}
]
守则:
让arr1=[{
id:'1',
创建日期:“2017-01-24”
},
{
id:'2',
创建日期:“2017-01-22”
},
];
设arr2=[{
id:'1',
名称:“测试”
},
{
id:'3',
福:“酒吧”
},
{
id:'2',
酒吧:“富”
},
];
让合并=[];
for(设i=0;iitmInner.id==arr1[i].id),
},
);
}
console.log(合并)代码>迭代较大的数组,即包含较小数组的数组:
让arr1=[{id:“1”,createdDate:“2017-01-24”},{id:“2”,createdDate:“2017-01-22”},arr2=[{id:“1”,name:“test”},{id:“3”,foo:“bar”},{id:“2”,bar:“foo”};
const merged=arr2.map(项=>({
…arr1.find(({id})=>id==item.id),
…项目
}));
console.log(合并)
您可以创建包含arr1
和arr2
元素的新对象,按id
键分组,如下所示,合并的数组将存储在对象值上
您可以使用object.values
func获取对象值
让arr1=[{
id:'1',
创建日期:“2017-01-24”
},
{
id:'2',
创建日期:“2017-01-22”
},
];
设arr2=[{
id:'1',
名称:“测试”
},
{
id:'3',
福:“酒吧”
},
{
id:'2',
酒吧:“富”
},
];
constgroupbyid={};
for(设i=0;i console.log(合并)
您可以采用单循环方法,将对象存储在按id
排序的哈希表中
const
mergeTo=(目标,对象={})=>o=>{
如果(!objects[o.id])target.push(objects[o.id]={});
分配(对象[o.id],o);
},
array1=[{id:'1',createdDate:'2017-01-24'},{id:'2',createdDate:'2017-01-22'}],
array2=[{id:'1',name:'test'},{id:'3',foo:'bar'},{id:'2',bar:'foo'}],
合并=[],
合并=合并到(合并);
阵列1.forEach(合并);
array2.forEach(合并);
console.log(合并)代码>
.as console wrapper{max height:100%!important;top:0;}
可以按原样合并两个数组,然后“挤压”它:
让arr1=[{
id:'1',
创建日期:“2017-01-24”
},
{
id:'2',
创建日期:“2017-01-22”
},
];
设arr2=[{
id:'1',
名称:“测试”
},
{
id:'3',
福:“酒吧”
},
{
id:'2',
酒吧:“富”
},
];
让merged=[…arr1,…arr2]。减少(
(acc,{id,…props})=>
(acc.set(id,{…(acc.get(id)|{}),…props}),acc),newmap();
console.log([…merged].map([id,props])=>({id,…props}))
您可以编写一个函数,将数组缩减为一个对象,然后从该对象提取值,该值将返回您想要的值。您可以看到下面的代码:
let arr1 = [
{
id: '1',
createdDate: '2017-01-24',
},
{
id: '2',
createdDate: '2017-01-22',
},
];
let arr2 = [
{
id: '1',
name: 'test',
},
{
id: '3',
foo: 'bar',
},
{
id: '2',
bar: 'foo',
},
];
function merge(arr1 = [], arr2 = []) {
return Object.values(
arr1.concat(arr2).reduce(
(acc, curr) => ({
...acc,
[curr.id]: { ...(acc[curr.id] ?? {}), ...curr },
}),
{}
)
);
}
const merged = merge(arr1, arr2);
输出:
[
{
"id": "1",
"createdDate": "2017-01-24",
"name": "test"
},
{
"id": "2",
"createdDate": "2017-01-22",
"bar": "foo"
},
{
"id": "3",
"foo": "bar"
}
]
因此,如果我不知道哪个数组更大,我需要首先比较长度?前提是您确定其中一个数组包含较小数组也包含的所有ID。否则,请改用中间对象技术。