首页 > 解决方案 > 将对象数组与相似数据合并的有效方法

问题描述

我有两个具有非常大但未知数量的对象的数组。例如:

const x = [
  {
    id:'apples',
    oldData: {
      min: 9,
      max: 50
    }
  },
  ...
]

const y = [
  {
    id:'bananas',
    newData: {
      min: 2,
      max: 60
    }
  },

  {
    id:'apples',
    newData: {
      min: 50,
      max: 200
    }
  },
  ...
]

我需要结合这些,所以我的结果是这样的:

const x = [
  {
    id:'apples',
    oldData: {
      min: 9,
      max: 50
    },
    newData: {
      min: 50,
      max: 200
    }
  },
  {
    id:'bananas',
    newData: {
      min: 2,
      max: 60
    }
  }
  ...
]

请注意,apples 被组合以包含来自两个数组的数据,并且由于没有匹配项,bananas 被添加为新元素。每个数组都可以有数百个值,所以我发现这样做.map()并且Object.keys().map()非常昂贵。

使用 ES6 和 Lodash 被导入。

标签: javascriptarraysobjectecmascript-6

解决方案


您可以尝试以下

const x = [{id:'apples',oldData: {min: 9,max: 50}}];
const y = [{id:'bananas',newData: {min: 2,max: 60}},{id:'apples',newData: {min: 50,max: 200}}];

// Create an object with id as key and object as value
let obj = x.reduce((a,c) => Object.assign(a, {[c.id]:c}), {});
// Updating the value of object and adding new entries
y.forEach(v => {
  if(obj[v.id]) obj[v.id].newData = v.newData;
  else obj[v.id] = v;
});
// Getting the values in the object
console.log(Object.values(obj));


推荐阅读