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

按order_id合并对象并累加price,500+数据场景reduce是否适用?

合并对象数组并累加字段:reduce是最优解吗?

嘿,这个场景特别适合用reduce方法来搞定,而且它绝对是这类数组聚合需求里最简洁高效的方案之一!

为什么reduce适合?

reduce方法的核心就是对数组进行遍历,并将元素逐步聚合为一个最终结果——刚好完美匹配你“按order_id分组、累加对应price”的需求,不用额外维护外部变量,逻辑闭环性很强。

具体实现代码

直接用reduce构建一个以order_id为键的中间对象,最后转成数组即可:

const sales = [
  { order_id: 138, price: 25 },
  { order_id: 138, price: 30 },
  { order_id: 139, price: 15 },
  { order_id: 131, price: 25 },
];

const mergedSales = Object.values(
  sales.reduce((acc, currentItem) => {
    // 检查当前order_id是否已存在于累加器中
    if (acc[currentItem.order_id]) {
      acc[currentItem.order_id].price += currentItem.price;
    } else {
      // 不存在则新建条目,避免修改原数组对象
      acc[currentItem.order_id] = { ...currentItem };
    }
    return acc;
  }, {}) // 初始值设为空对象,用来存储分组后的结果
);

console.log(mergedSales);
// 输出结果完全符合你的需求:
// [
//   { order_id: 138, price: 55 },
//   { order_id: 139, price: 15 },
//   { order_id: 131, price: 25 }
// ]

其他可选实现方式

当然你也可以用forEach来实现,但代码会稍显繁琐,需要手动维护外部的累加对象:

const acc = {};
sales.forEach(item => {
  if (acc[item.order_id]) {
    acc[item.order_id].price += item.price;
  } else {
    acc[item.order_id] = { ...item };
  }
});
const mergedSales = Object.values(acc);

总结

处理500+条数据的话,reduce和forEach在性能上几乎没有差别,但reduce的代码更紧凑、逻辑更内聚,是这个场景下的首选方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:46:06