【问题标题】:How to merge two array of objects according to custom criteria?如何根据自定义条件合并两个对象数组?
【发布时间】:2018-02-19 11:23:22
【问题描述】:

下面是两个数组

arr1 = [
  { item1: 1, id: 1 },
  { item1: 4, id: 3 }
 ];

arr2 = [
  { item2: 1, id: 2 },
  { item2: 2, id: 3 }
 ];

我需要像这样的合并数组

 arr3 = [
   { item1: 1, id: 1 },
   { item2: 1, id: 2 },
   { item1: 4, item2: 2, id: 3 }
  ];

如何做到这一点?

编辑:如果两个数组都有相同 id 的对象,那么我想合并它。在示例中,两个数组中各有一个对象,id 为 3。所以它被合并,如图所示。

【问题讨论】:

  • 您的标准到底是什么?
  • @Praveen 只是猜测,但我想说具有相同 id 的对象将在同一个对象中同时具有 item1item2

标签: javascript arrays merge


【解决方案1】:

array#concat 你的数组和基于id 使用array#reduce 对对象进行分组,合并具有相同id 的对象。然后使用Object.values()提取所有值。

var arr1 = [ { item1: 1, id: 1 }, { item1: 4, id: 3 } ], 
    arr2 = [ { item2: 1, id: 2 }, { item2: 2, id: 3 } ],
    result = Object.values([].concat(arr1, arr2).reduce((r,o) => {
          r[o.id] = r[o.id] || {};
          Object.assign(r[o.id], o);
          return r;
        },{}));
console.log(result);

【讨论】:

    【解决方案2】:

    你可以这样做:

    var arr1 = [
      { item1: 1, id: 1 },
      { item1: 4, id: 3 }
     ];
    
    var arr2 = [
      { item2: 1, id: 2 },
      { item2: 2, id: 3 }
    ];
    
    var hash = {};
    arr1.forEach(elem => { hash[elem.id] = {...hash[elem.id], ...elem} });
    arr2.forEach(elem => { hash[elem.id] = {...hash[elem.id], ...elem} });
    
    var result = Object.keys(hash).map(id => hash[id]);
    

    我试图做的是像这样构造一个对象:

    {
       1: { item1: 1, id: 1 }
       2: { item2: 2, id: 2 },
       3: { item1: 4, item2: 2, id: 3 }
    }
    

    然后将其转换回您想要的格式的数组

    注意:我没有测试过这段代码。

    【讨论】:

    • 我刚刚测试过,它只给出[ { item1: 4, id: 3, item2: 2 } ]
    【解决方案3】:

    您可以使用 ES6 Map 和数组中的扩展语法和 Object.assign

    const arr1 = [{ item1: 1, id: 1 },{ item1: 4, id: 3 }];
    const arr2 = [{ item2: 1, id: 2 },{ item2: 2, id: 3 }];
     
    const map = [...arr1, ...arr2].reduce((r, e) => {
      return r.set(e.id, Object.assign({}, r.get(e.id), e)), r
    }, new Map)
    
    const result = [...map.values()]
    
    console.log(result)

    【讨论】:

      【解决方案4】:

      使用 LoDash:

      var arr1 = [
        { item1: 1, id: 1 },
        { item1: 4, id: 3 }
       ];
      
      var arr2 = [
        { item2: 1, id: 2 },
        { item2: 2, id: 3 }
      ];
      
      var ids1 = _.map(arr1, 'id');
      var ids2 = _.map(arr2, 'id');
      var ids = _.concat(ids1, ids2);
      var uniq_ids = _.uniq(ids);
      
      var result = [];
      for(var i = 0; i < uniq_ids.length; i++) {
        var ob1 = _.find(arr1, {id: uniq_ids[i]});
        var ob2 = _.find(arr2, {id: uniq_ids[i]});
        result.push(_.merge(ob1, ob2));	
      }
      
      console.log(result);
      &lt;script src="https://cdn.jsdelivr.net/npm/lodash@4.17.5/lodash.min.js"&gt;&lt;/script&gt;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-12
        • 2022-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-26
        • 2020-10-13
        相关资源
        最近更新 更多