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

时间:2018-05-05 08:45:40

标签: javascript node.js

我有两个对象数组。示例

'^ .... $'

我需要基于匹配的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合并两个对象数组。

4 个答案:

答案 0 :(得分:3)

使用Object.assign以便您可以将数组与公共id值组合使用,使用find条件来比较两个对象的id。< / p>

&#13;
&#13;
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;
&#13;
&#13;

  

由于您多次使用相同的键名,因此被忽略   JSON对象所以我为此采用了新的属性名key2   示例

答案 1 :(得分:3)

建立@Ankit答案,你也可以使用传播运营商! 像这样的东西

&#13;
&#13;
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;
&#13;
&#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; }

<强>文档: