Javascript 我如何找到重复的公司,并将它们合并为一个,并将它们的权重相加

Javascript 我如何找到重复的公司,并将它们合并为一个,并将它们的权重相加,javascript,node.js,Javascript,Node.js,我尝试过使用一些不同的选项,包括filter、reduce和includes,但我不知道如何做到这一点 我在下面有一组对象: [ { 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 }, {

我尝试过使用一些不同的选项,包括filter、reduce和includes,但我不知道如何做到这一点

我在下面有一组对象:

[
  { 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),
     };
  },  
  {}
);
可以使用按公司名称创建映射,然后使用转换回数组

例如:

a=[
{名称:'GrapeCo',重量:0.15},
{名称:'MicroFit',重量:0.5},
{名称:'GreenCo',重量:0.3},
{名称:'GrapeCo',重量:0.2},
{名称:'GrapeCo',重量:0.3},
{名称:'GoldenGadgets',重量:0.3},
{名称:'SpaceY',重量:0.3},
{名称:'BeanzRUS',重量:0.6},
{名称:'GrapeCo',重量:0.2},
{名称:'SolarCorp',重量:0.8}
]
让result=Object.values(a.reduce((acc,elem)=>{
acc[elem.name]=acc[elem.name]|{name:elem.name,weight:0};
acc[elem.name].weight+=elem.weight;
返回acc;
}, {}));
控制台日志(结果)您可以使用按公司名称创建映射,然后使用转换回数组

例如:

a=[
{名称:'GrapeCo',重量:0.15},
{名称:'MicroFit',重量:0.5},
{名称:'GreenCo',重量:0.3},
{名称:'GrapeCo',重量:0.2},
{名称:'GrapeCo',重量:0.3},
{名称:'GoldenGadgets',重量:0.3},
{名称:'SpaceY',重量:0.3},
{名称:'BeanzRUS',重量:0.6},
{名称:'GrapeCo',重量:0.2},
{名称:'SolarCorp',重量:0.8}
]
让result=Object.values(a.reduce((acc,elem)=>{
acc[elem.name]=acc[elem.name]|{name:elem.name,weight:0};
acc[elem.name].weight+=elem.weight;
返回acc;
}, {}));

控制台日志(结果)此处使用
reduce

let数据=[
{名称:'GrapeCo',重量:0.15},
{名称:'MicroFit',重量:0.5},
{名称:'GreenCo',重量:0.3},
{名称:'GrapeCo',重量:0.2},
{名称:'GrapeCo',重量:0.3},
{名称:'GoldenGadgets',重量:0.3},
{名称:'SpaceY',重量:0.3},
{名称:'BeanzRUS',重量:0.6},
{名称:'GrapeCo',重量:0.2},
{名称:'SolarCorp',重量:0.8}
]
让result=data.reduce((a,{name,weight})=>{
设i=a.findIndex(el=>el.name==name);
如果(i<0)返回[…a,{name,weight}];
a[i].重量+=重量;
返回a;
}, [])

控制台日志(结果)此处使用
reduce

let数据=[
{名称:'GrapeCo',重量:0.15},
{名称:'MicroFit',重量:0.5},
{名称:'GreenCo',重量:0.3},
{名称:'GrapeCo',重量:0.2},
{名称:'GrapeCo',重量:0.3},
{名称:'GoldenGadgets',重量:0.3},
{名称:'SpaceY',重量:0.3},
{名称:'BeanzRUS',重量:0.6},
{名称:'GrapeCo',重量:0.2},
{名称:'SolarCorp',重量:0.8}
]
让result=data.reduce((a,{name,weight})=>{
设i=a.findIndex(el=>el.name==name);
如果(i<0)返回[…a,{name,weight}];
a[i].重量+=重量;
返回a;
}, [])

控制台日志(结果)公司出现问题。减少回调。您需要使用
acc[elem.name]
而不是
acc[name]

const公司=[
{名称:'GrapeCo',重量:0.15},
{名称:'MicroFit',重量:0.5},
{名称:'GreenCo',重量:0.3},
{名称:'GrapeCo',重量:0.2},
{名称:'GrapeCo',重量:0.3},
{名称:'GoldenGadgets',重量:0.3},
{名称:'SpaceY',重量:0.3},
{名称:'BeanzRUS',重量:0.6},
{名称:'GrapeCo',重量:0.2},
{名称:'SolarCorp',重量:0.8}
];
const groupedBy=公司。减少((acc,elem)=>({
…acc,
[元件名称]:元件重量+(附件[元件名称]| | 0)
}), {});
const result=Object.entries(groupedBy.map)([name,weight])=>({
名称
重量:parseFloat(重量:toFixed(2))
}));

控制台日志(结果)公司出现问题。减少回调。您需要使用
acc[elem.name]
而不是
acc[name]

const公司=[
{名称:'GrapeCo',重量:0.15},
{名称:'MicroFit',重量:0.5},
{名称:'GreenCo',重量:0.3},
{名称:'GrapeCo',重量:0.2},
{名称:'GrapeCo',重量:0.3},
{名称:'GoldenGadgets',重量:0.3},
{名称:'SpaceY',重量:0.3},
{名称:'BeanzRUS',重量:0.6},
{名称:'GrapeCo',重量:0.2},
{名称:'SolarCorp',重量:0.8}
];
const groupedBy=公司。减少((acc,elem)=>({
…acc,
[元件名称]:元件重量+(附件[元件名称]| | 0)
}), {});
const result=Object.entries(groupedBy.map)([name,weight])=>({
名称
重量:parseFloat(重量:toFixed(2))
}));

控制台日志(结果)这真的很好,但我得到了一些关于“acc[elem.name]”和“weight”的TS错误。有什么想法吗?您得到了什么错误?获取权重是未知的,
元素隐式地具有“Any”类型,因为类型为“string”的表达式不能用于索引类型“{}”。
对于“acc[elem.name]”,您可以这样使用。使用
elem.weight
use
elem['weight']
代替
acc[elem.name]
,使用
acc[elem['name']]
这确实很有效,但我在“acc[elem.name]”和“weight”方面遇到了一些错误。有什么想法吗?您得到了什么错误?获取权重是未知的,
元素隐式地具有“Any”类型,因为类型为“string”的表达式不能用于索引类型“{}”。
对于“acc[elem.name]”,您可以这样使用。使用
elem['weight']
代替
elem['weight']
使用
acc[elem.name]
代替
acc[elem['name']