如何用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
相关产品推荐
相关产品推荐

