我有两个对象数组。示例
'^ .... $'
我需要基于匹配的id值这样: 每个obj都有一个唯一的密钥id,就是第二个数组。
data1 = [{
foo: '2',
box: 'yes',
id: '1234'
}, {
foo: '34',
box: 'no',
id: '1235'
}];
data2 = [{
key: 'value',
key: 'value',
id: '1234'
}, {
key: 'value',
key: 'value',
id: '1235'
}];
基本上根据键id合并两个对象数组。
答案 0 :(得分:3)
使用Object.assign
以便您可以将数组与公共id
值组合使用,使用find
条件来比较两个对象的id
。< / p>
var data1 =[ {foo:'2',box:'yes',id:'1234'},{foo:'34',box:'no',id:'1235'} ];
var data2 =[{key:'value',key2:'value2', id:'1234'},{key:'value',key2:'value2', id:'1235'}];
data1.map(x => Object.assign(x, data2.find(y => y.id == x.id)));
console.log(data1);
&#13;
由于您多次使用相同的键名,因此被忽略 JSON对象所以我为此采用了新的属性名
key2
示例
答案 1 :(得分:3)
建立@Ankit答案,你也可以使用传播运营商! 像这样的东西
var data1 =[ {foo:'2',box:'yes',id:'1234'},{foo:'34',box:'no',id:'1235'} ];
var data2 =[{key:'value',key2:'value2', id:'1234'},{key:'value',key2:'value2', id:'1235'}];
const arr = data1.map(x => ({ ...x, ...data2.find(y => y.id == x.id)}));
console.log(arr);
&#13;
答案 2 :(得分:1)
您还可以使用reduce()
,find()
数组和Object.assign()
来获取所需的结果。
DEMO
const data1 = [{foo: '2',box: 'yes',id: '1234'}, {foo: '34',box: 'no',id: '1235'}],
data2 = [{key: 'value',key1: 'value',id: '1234'}, {key: 'value',key1: 'value',id: '1235'}];
let result = data1.reduce((r,{id,...rest})=>{
let find=data2.find(o=>o.id==id);
if(find){
r.push(Object.assign(rest,find));
}
return r;
},[])
console.log(result)
.as-console-wrapper {max-height: 100% !important;top: 0;}
答案 3 :(得分:0)
以下是实现此目的的另一种方法:
Map
对象,其中id将用作键,相关对象用作其值。Object.assign()
对象中的Map
迭代第二个数组并使用相同的ID更新相应的对象。Map
对象中返回一组更新的对象。<强>演示:强>
let data1 = [{foo: '2', box: 'yes', id: '1234'}, {foo: '34', box: 'no', id: '1235'}],
data2 = [{key1: 'value', key2: 'value', id: '1234'}, {key1: 'value', key2: 'value', id: '1235'}];
let merge = (d1, d2, m = new Map(d1.map(o => [o.id, o]))) => (
d2.forEach(o => m.set(o.id, Object.assign(m.get(o.id), o))),
[...m.values()]
);
console.log(merge(data1, data2));
.as-console-wrapper { max-height: 100% !important; top: 0; }
<强>文档:强>