繁体   English   中英

将对象数组作为Node.js中Array对象的值

[英]Making an array of object a value of a object in Array in Node.js

我有两个对象数组。

 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值:每个obj都有一个唯一的密钥id,就是第二个数组。

finalData = [{
    foo: '2',
    box: 'yes',
    id: '1234',
    key: 'value',
    key: 'value'
}, {
    box: '34',
    box: 'no',
    id: '1235',
    key: 'value',
    key: 'value'
}];

基本上根据键id合并两个对象数组。

为此使用Object.assign ,以便您可以将数组与公共id值组合,使用find having condition来比较两个对象的id

 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); 

由于您具有多次相同的键名,JSON对象会忽略该名称,因此我为此示例采用了新的属性名称key2

建立在@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); 

您还可以使用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;} 

以下是实现此目的的另一种方法:

  • 迭代第一个数组并创建一个新的Map对象,其中id将用作键,相关对象用作其值。
  • 迭代第二个数组并使用Map对象中的Object.assign()更新具有相同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; } 

文档:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM