首页 > 解决方案 > 如何找到重复的公司并将它们合并为一个并将它们的权重相加

问题描述

我尝试使用过滤器、减少和包含中的一些不同选项,但无法理解如何执行此操作。

我在下面有这个对象数组:

[
  { name: 'GrapeCo', weight: 0.15 },
  { name: 'MicroFit', weight: 0.5 },
  { name: 'GreenCo', weight: 0.3 },
  { name: 'GrapeCo', weight: 0.2 },
  { name: 'GrapeCo', weight: 0.3 },
  { name: 'GoldenGadgets', weight: 0.3 },
  { name: 'SpaceY', weight: 0.3 },
  { name: 'BeanzRUS', weight: 0.6 },
  { name: 'GrapeCo', weight: 0.2 },
  { name: 'SolarCorp', weight: 0.8 }
]

我想找到所有重复的命名公司并将它们合并为一个总重量。

所以输出会是这样的:

[
  { name: 'MicroFit', weight: 0.5 },
  { name: 'GreenCo', weight: 0.3 },
  { name: 'GoldenGadgets', weight: 0.3 },
  { name: 'SpaceY', weight: 0.3 },
  { name: 'BeanzRUS', weight: 0.6 },
  { name: 'GrapeCo', weight: 0.85 },
  { name: 'SolarCorp', weight: 0.8 }
]

我一直在尝试使用的 reduce 方法如下所示:

companies.reduce(
  (acc, elem) => {
     return {
        ...acc,
        [elem.name]: elem.weight + (acc[name] || 0),
     };
  },  
  {}
);

标签: javascriptnode.js

解决方案


您可以使用Array.reduce按公司名称创建地图,然后使用Object.values转换回数组。

例如:

let a = [
  { name: 'GrapeCo', weight: 0.15 },
  { name: 'MicroFit', weight: 0.5 },
  { name: 'GreenCo', weight: 0.3 },
  { name: 'GrapeCo', weight: 0.2 },
  { name: 'GrapeCo', weight: 0.3 },
  { name: 'GoldenGadgets', weight: 0.3 },
  { name: 'SpaceY', weight: 0.3 },
  { name: 'BeanzRUS', weight: 0.6 },
  { name: 'GrapeCo', weight: 0.2 },
  { name: 'SolarCorp', weight: 0.8 }
]

let result = Object.values(a.reduce((acc, elem) => { 
    acc[elem.name] = acc[elem.name] || { name: elem.name, weight: 0 };
    acc[elem.name].weight += elem.weight;
    return acc;
}, {}));

console.log(result);


推荐阅读