【问题标题】:Merge objects of an array into one object by key将数组的对象按键合并为一个对象
【发布时间】:2021-01-24 20:00:50
【问题描述】:

如果数组的对象具有相同的键,我会尝试将它们合并为一个。

拥有这个数组:

let data = [
  { id: "1", cars: 5 }, 
  { id: "1", pasta: 2 },
  { id: "2", cars: 0 }, 
  { id: "2", pasta: 0 },
];

我想实现这个:

let data = [
  { id: "1", cars: 5, pasta: 2 },
  { id: "2", cars: 0, pasta: 0 },
];

我正在寻找任何解决方案,但最好是 ES6。

【问题讨论】:

    标签: javascript arrays ecmascript-6 javascript-objects


    【解决方案1】:

    这是一个结合了 Array reduce 方法和 Object values 方法的解决方案。这种方法的一个好处是它的时间复杂度为 O(n),这仅在您拥有大量数据时才真正重要,但仍可能比在循环中包含循环的解决方案更有效。

    let data = [
      { id: "1", cars: 5 }, 
      { id: "1", pasta: 2 },
      { id: "2", cars: 0 }, 
      { id: "2", pasta: 0 },
    ];
    
    const combined = Object.values(data.reduce((acc, el) => {
      acc[el.id] = { ...acc[el.id], ...el };
      return acc;
    }, {}));
    
    console.log(combined);

    【讨论】:

      【解决方案2】:

      使用Array.prototype.reduce()

      let data = [
        { id: "1", cars: 5 }, 
        { id: "1", pasta: 2 },
        { id: "2", cars: 0 }, 
        { id: "2", pasta: 0 },
      ]
      
      const result = data.reduce((items, item) => {
        const existingItem = items.find(({ id }) => id === item.id)
      
        if (existingItem) Object.assign(existingItem, item)
        else items.push({ ...item })
      
        return items
      }, [])
      
      console.log(result)
      
      // Original array is left intact:
      console.log(data)

      【讨论】:

        猜你喜欢
        • 2021-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-08
        • 1970-01-01
        • 1970-01-01
        • 2022-11-08
        相关资源
        最近更新 更多