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

React中如何按ID对数组求和并生成新数组

按ID分组求和数组元素

给定如下数组:

const data = [
  {"id": "One", "number": 100}, 
  {"id": "One", "number": 150}, 
  {"id": "One", "number": 200}, 
  {"id": "Two", "number": 50}, 
  {"id": "Two", "number": 100}, 
  {"id": "Three", "number": 10}, 
  {"id": "Three", "number": 90}
];

需求:按id字段分组,将每组对应的number值求和,生成如下结构的新数组:

[
  {"id": "One", "number": 450},
  {"id": "Two", "number": 150}, 
  {"id": "Three", "number": 100}, 
]

解决方案1:使用reduce和Object.values

这是最简洁的实现方式,利用reduce遍历数组并累加数据,最后转换为目标数组:

const data = [
  {"id": "One", "number": 100}, 
  {"id": "One", "number": 150}, 
  {"id": "One", "number": 200}, 
  {"id": "Two", "number": 50}, 
  {"id": "Two", "number": 100}, 
  {"id": "Three", "number": 10}, 
  {"id": "Three", "number": 90}
];

const result = Object.values(data.reduce((acc, item) => {
  // 若当前id未在累加对象中,初始化条目
  if (!acc[item.id]) {
    acc[item.id] = { id: item.id, number: 0 };
  }
  // 累加number值
  acc[item.id].number += item.number;
  return acc;
}, {}));

console.log(result);

解决方案2:使用Map结构

如果需要保留原数组中id的出现顺序,可以用Map来实现(Map会保持键的插入顺序):

const data = [
  {"id": "One", "number": 100}, 
  {"id": "One", "number": 150}, 
  {"id": "One", "number": 200}, 
  {"id": "Two", "number": 50}, 
  {"id": "Two", "number": 100}, 
  {"id": "Three", "number": 10}, 
  {"id": "Three", "number": 90}
];

const sumMap = new Map();

data.forEach(item => {
  if (sumMap.has(item.id)) {
    // 已存在则累加number
    sumMap.get(item.id).number += item.number;
  } else {
    // 不存在则添加新条目(用扩展运算符避免修改原对象)
    sumMap.set(item.id, { ...item });
  }
});

// 将Map的value转换为数组
const result = Array.from(sumMap.values());

console.log(result);

内容的提问来源于stack exchange,提问作者sonic831

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 15:20:32