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

对象数组遍历难题:如何累加相同vendorId对象的average值

解决相同vendorId的average值累加问题

嘿,这个问题其实用JavaScript的reduce方法就能轻松搞定,它专门用来处理这种需要聚合数组数据的场景,效率也很高。

实现思路

我们可以借助一个临时对象来记录每个vendorId对应的累加结果,遍历数组时不断更新这个对象,最后再把它转换成我们需要的数组格式。

完整代码示例

var arr = [ 
  {average:58.5,contractNumber:"5100020753",vendorId:9}, 
  {average:23.3,contractNumber:"5100020313",vendorId:24}, 
  {average:58.5,contractNumber:"5100019779",vendorId:9}
];

// 使用reduce进行累加
const aggregatedData = arr.reduce((accumulator, currentItem) => {
  // 检查当前vendorId是否已经在累加器中存在
  if (accumulator[currentItem.vendorId]) {
    // 存在则累加average值
    accumulator[currentItem.vendorId].average += currentItem.average;
  } else {
    // 不存在则添加新条目(用扩展运算符拷贝对象,避免修改原数组)
    accumulator[currentItem.vendorId] = { ...currentItem };
  }
  return accumulator;
}, {}); // 初始值设为空对象

// 将累加器对象转换为最终的数组格式
const finalResult = Object.values(aggregatedData);

console.log(finalResult);
// 输出结果:
// [
//   { average: 117, contractNumber: "5100020753", vendorId: 9 },
//   { average: 23.3, contractNumber: "5100020313", vendorId: 24 }
// ]

代码解释

  1. reduce方法的作用:它会遍历数组中的每一个元素,我们传入的回调函数负责处理每个元素,accumulator就是我们用来存储中间结果的累加器(初始值是空对象)。
  2. 判断vendorId是否存在:每次遍历到一个对象,先检查累加器里有没有以当前vendorId为键的条目:
    • 如果有,就把当前对象的average值加到已有的条目上;
    • 如果没有,就把当前对象的浅拷贝存入累加器,键设为vendorId。
  3. 转换为数组:最后用Object.values()把累加器对象里的所有值提取出来,就得到了我们需要的、按vendorId聚合后的数组。

可选优化(如果不需要保留contractNumber)

如果你不需要保留contractNumber字段,也可以只存储必要的信息,这样代码会更简洁:

const aggregatedData = arr.reduce((acc, curr) => {
  acc[curr.vendorId] = (acc[curr.vendorId] || 0) + curr.average;
  return acc;
}, {});

const finalResult = Object.entries(aggregatedData).map(([vendorId, average]) => ({
  vendorId: Number(vendorId),
  average
}));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:56:22