You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:45:21