javascript - 如何找到重复的公司并将它们合并为一个并将它们的权重相加
问题描述
我尝试使用过滤器、减少和包含中的一些不同选项,但无法理解如何执行此操作。
我在下面有这个对象数组:
[
{ 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),
};
},
{}
);
解决方案
您可以使用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);
推荐阅读
- php - 使用 PHP Mailer 通过 GSuite 发送邮件时出现 DKIM 错误
- ios13 - WatchOS 6 TTS 错误?AXSpeechManager isSpeaking 崩溃
- python - 编写一个程序,要求用户输入两个整数并检查其中一个是否是另一个的倍数
- javascript - 使用 ng-repeat 过滤列表
- python - 理解位置参数的直观方法不应遵循关键字参数
- java - 如何在java中从给定的地图值中找到最新日期
- python - numpy.transpose 的时间复杂度
- sql - 如何计算我的库存来自的订单?
- uwp - 使用 WindowsTemplateStudio 时如何修改 main.cs 中的导航菜单?
- python - 为什么tensorflow 2.0.0(官方)比tensorflow 2.0.0-beta1慢很多?(都是cpu版本)