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

如何用JavaScript按ID合并数组值,将大数组整理为简洁数组?

最优方案:使用Array.prototype.reduce()完成聚合

嘿,这个需求很典型——按ID分组累加数值,用reduce来处理是最高效的方式,只需要一次遍历就能搞定,时间复杂度O(n),比那些先提取唯一ID再循环累加的方法(O(n²))要快得多。

直接上代码,一步到位:

const myarr = [{id: 10, val:100}, {id:10, val: 100}, {id:20, val:200}, {id:20, val:100}, {id:30, val:100}];

const sortedArr = Object.entries(
  myarr.reduce((acc, { id, val }) => {
    // 累加当前ID的val,不存在则初始化为0再加
    acc[id] = (acc[id] || 0) + val;
    return acc;
  }, {})
).map(([id, val]) => ({ id: Number(id), val }));

console.log(sortedArr);
// 输出:[{id: 10, val: 200}, {id:20, val:300}, {id:30, val:100}]

代码拆解:

  • 第一步(reduce):遍历原数组,用一个对象做累加器,把每个ID对应的val累加起来。这里用(acc[id] || 0)处理首次出现的ID,避免undefined + val变成NaN。
  • 第二步(Object.entries + map):把累加后的对象转成键值对数组,再映射成你需要的{id, val}格式。注意要把字符串类型的ID转成数字,因为对象的键默认是字符串。

额外说明:

  • 这个方法会保留原数组中ID首次出现的顺序(ES6+的对象会维护属性插入顺序),如果需要按ID排序,可以在最后加个.sort((a,b) => a.id - b.id)。
  • 如果你的数组规模很大,这个方法的性能优势会更明显,因为只遍历一次原数组,没有额外的嵌套循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:40:13