按picker_id分组求和嵌套对象数组字段的问题修正
分组求和问题修正
需求概述
对包含嵌套products数组的对象数组,按picker_id分组,分别求和以下字段:
current_capacity(对应结果中的total_volume)process_time_in_minutes(对应结果中的total_time)- 嵌套
products数组中所有picked_qty的总和(对应结果中的total_products)
原始数据
var arr = [ { current_capacity: 6000, picker_id: "icQrHPuE2fMZslceSG6liwuRar92", process_time_in_minutes: 10, products: [ { product_id: 1, picked_qty: 2 }, { product_id: 2, picked_qty: 3 } ] }, { current_capacity: 2500, picker_id: "icQrHPuE2fMZslceSG6liwuRar92", process_time_in_minutes: 20, products: [ { product_id: 1, picked_qty: 10 } ] }, { current_capacity: 36000, picker_id: "WIRzfIZALeftRk3DRGvh4nBdxQV2", process_time_in_minutes: 15, products: [ { product_id: 1, picked_qty: 2 }, { product_id: 2, picked_qty: 3 } ] } ];
原实现代码
var res = arr.reduce((acc, obj) => { var existObj = acc.find((item) => item.picker_id === obj.picker_id); if (existObj) { let total_picked = obj.products.reduce((acc2, curr) => acc2 + curr); existObj.current_capacity = existObj.current_capacity + obj.current_capacity; existObj.process_time_in_minutes = existObj.process_time_in_minutes + obj.process_time_in_minutes; existObj.total = existObj.total ? existObj.total : 0 + total_picked; return acc; } acc.push(obj); return acc; }, []); const formatted = res.map((el) => { return { picker_id: el.picker_id, total_volume: el.current_capacity, total_time: el.process_time_in_minutes, total_products: el.total }; });
当前错误结果
[ { picker_id: "icQrHPuE2fMZslceSG6liwuRar92", total_volume: 8500, total_time: 30, total_products: "0[object Object]" }, { picker_id: "WIRzfIZALeftRk3DRGvh4nBdxQV2", total_volume: 36000, total_time: 15, total_products: undefined } ]
期望正确结果
[ { picker_id: "icQrHPuE2fMZslceSG6liwuRar92", total_volume: 8500, total_time: 30, total_products: 15 }, { picker_id: "WIRzfIZALeftRk3DRGvh4nBdxQV2", total_volume: 36000, total_time: 15, total_products: 5 } ]
修正方案及代码
原代码存在三个核心错误:
- 计算
total_picked时,直接累加对象curr而非对象的picked_qty属性,导致字符串拼接错误 - 初始化
existObj.total时运算符优先级错误,0 + total_picked未被正确执行 - 新对象加入数组时未初始化
total字段,导致最终结果出现undefined
修正后的完整代码:
var res = arr.reduce((acc, obj) => { // 计算当前对象的products总和 const currentPickedTotal = obj.products.reduce((sum, product) => sum + product.picked_qty, 0); var existObj = acc.find((item) => item.picker_id === obj.picker_id); if (existObj) { // 累加容量和时间 existObj.current_capacity += obj.current_capacity; existObj.process_time_in_minutes += obj.process_time_in_minutes; // 累加products总和,确保初始值为0 existObj.total += currentPickedTotal; return acc; } // 新对象加入时,复制原对象并初始化total字段 acc.push({ ...obj, total: currentPickedTotal }); return acc; }, []); const formatted = res.map((el) => { return { picker_id: el.picker_id, total_volume: el.current_capacity, total_time: el.process_time_in_minutes, total_products: el.total }; });
关键修正点说明
- 新增
currentPickedTotal变量,正确计算当前对象products中picked_qty的总和 - 累加
total时使用+=,并确保新对象加入时已初始化total为当前对象的picked_qty总和 - 使用扩展运算符
...obj复制原对象,避免修改原始数据引用
内容的提问来源于stack exchange,提问作者Muhammad Haekal
相关产品推荐
相关产品推荐

