ES9 下如何优雅实现根据订单数组更新承运人对象数组的属性值
ES9 优化实现方案
首先通过reduce一次性统计所有订单的承运商维度数据,再遍历承运人数组赋值,时间复杂度为O(n+m),远优于嵌套循环的O(n*m),同时用到ES9正式支持的对象扩展运算符简化写法:
// 第一步:统计所有订单的承运商维度数据 const orderStats = orders.reduce((result, curOrder) => { const code = curOrder.carrier_code // 不存在对应承运商统计项则初始化 if (!result[code]) { result[code] = { items: 0, printable: 0 } } result[code].items++ result[code].printable += curOrder.printable return result }, {}) // 第二步:更新carrier数组,如果不想修改原数组可以用map返回新数组 const updatedCarrier = carrier.map(item => ({ ...item, // ES9 对象扩展运算符 ...(orderStats[item.carrier_code] || { items: 0, printable: 0 }) })) // 如果需要原地修改原carrier数组,用下面的写法即可 // carrier.forEach(item => Object.assign(item, orderStats[item.carrier_code] || { items: 0, printable: 0 }))
打印updatedCarrier即可得到你预期的结果。
方案优势
- 性能更优:仅需遍历两次数组,数据量越大相比嵌套循环的性能优势越明显
- 逻辑清晰:统计和赋值逻辑拆分,后续维护调整更简单
- 代码简洁:利用数组方法和ES9特性,没有冗余的嵌套判断
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

