JavaScript按id分组求和并为每组生成新对象的实现方法
按ID分组对象数组并求和total字段的实现方案
你现在的reduce写法确实只能得到键为id、值为求和total的对象,要转换成你期望的数组形式,可以稍微调整一下逻辑——先通过reduce构建一个以id为键的映射对象,存储每个分组的完整信息,最后再把这个映射的取值转成数组。
先看你的原始数据:
let data = [ {"id":"2018", "name":"test", "total":1200}, {"id":"2019", "name":"wath", "total":1500}, {"id":"2019", "name":"wath", "total":1800}, {"id":"2020", "name":"zooi", "total":1000}, ]
可以用下面的代码实现需求:
let result = Object.values(data.reduce((r, o) => { // 检查当前id是否已存在于映射中 if (r[o.id]) { // 存在则累加total r[o.id].total += o.total; } else { // 不存在则创建新对象,复制当前元素的所有属性 r[o.id] = { ...o }; } return r; }, {}));
代码解释:
reduce的初始值设为空对象{},用来临时存储每个id对应的分组对象;- 遍历数组时,若当前id已在映射里,就把当前元素的
total加到已有分组的total上; - 若id不存在,就用扩展运算符
...o复制当前元素的id、name和total,作为新的分组对象存入映射; - 最后用
Object.values()把映射对象里的所有分组对象提取出来,转换成数组,就是你想要的结果。
这里默认同一个id对应的name是一致的,如果有同一个id对应不同name的场景,可以根据需求调整(比如保留第一个name,或者做额外处理)。
内容的提问来源于stack exchange,提问作者fernando
相关产品推荐
相关产品推荐

