对象数组遍历难题:如何累加相同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 } // ]
代码解释
reduce方法的作用:它会遍历数组中的每一个元素,我们传入的回调函数负责处理每个元素,accumulator就是我们用来存储中间结果的累加器(初始值是空对象)。- 判断vendorId是否存在:每次遍历到一个对象,先检查累加器里有没有以当前
vendorId为键的条目:- 如果有,就把当前对象的
average值加到已有的条目上; - 如果没有,就把当前对象的浅拷贝存入累加器,键设为
vendorId。
- 如果有,就把当前对象的
- 转换为数组:最后用
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
相关产品推荐
相关产品推荐

