如何根据warehouse和deliveryWeek合并boxSize数组对象
解决方案
你的代码问题在于两点:一是只以deliveryWeek作为分组键,忽略了warehouse(如果不同仓库有同一配送周,会被错误合并);二是用Object.assign直接覆盖对象,导致后遍历的对象会替换掉之前的,没法合并两种箱子的字段。
要实现按warehouse和deliveryWeek合并对象,并拆分small/large的字段,可以这么做:
const boxSize = [ { warehouse: 'NYC', deliveryWeek: '2022-11-07', boxSize: 'small', total: 5 }, { warehouse: 'NYC', deliveryWeek: '2022-11-07', boxSize: 'large', total: 9 }, // 测试用例:不同仓库同配送周的情况 { warehouse: 'LA', deliveryWeek: '2022-11-07', boxSize: 'small', total: 3 } ]; const mergedMap = {}; boxSize.forEach(item => { // 用仓库+配送周作为唯一标识键,确保只有同仓库同周的对象才会合并 const key = `${item.warehouse}-${item.deliveryWeek}`; if (!mergedMap[key]) { // 初始化合并后的对象,保留基础的仓库和配送周信息 mergedMap[key] = { warehouse: item.warehouse, deliveryWeek: item.deliveryWeek }; } // 根据箱子类型,添加对应的字段 if (item.boxSize === 'small') { mergedMap[key].boxSizeSmall = item.boxSize; mergedMap[key].smallTotal = item.total; } else if (item.boxSize === 'large') { mergedMap[key].boxSizeLarge = item.boxSize; mergedMap[key].largeTotal = item.total; } }); // 将映射对象的值转为数组,得到最终结果 const result = Object.values(mergedMap); console.log(result);
逻辑说明:
- 分组键设计:用
warehouse和deliveryWeek的组合字符串作为键,避免不同仓库同周的对象被错误合并。 - 对象初始化:遇到新的分组键时,先创建包含基础信息的空对象。
- 字段拆分:根据当前元素的
boxSize,给合并对象添加对应的small或large相关字段,不会覆盖已有内容。
运行后输出结果如下:
[ { warehouse: 'NYC', deliveryWeek: '2022-11-07', boxSizeSmall: 'small', smallTotal: 5, boxSizeLarge: 'large', largeTotal: 9 }, { warehouse: 'LA', deliveryWeek: '2022-11-07', boxSizeSmall: 'small', smallTotal: 3 } ]
内容的提问来源于stack exchange,提问作者mattjkj
相关产品推荐
相关产品推荐

