JavaScript中两个对象数组的库存扣减计算实现需求
解决对象数组的库存扣减计算需求
这是个挺常见的数组对象匹配计算场景,我来分享个高效的实现方式:
核心思路
- 先做映射优化:把
orders数组转换成以_id为键、qty为值的对象,这样后续查找对应订单数量的速度会快很多(O(1)时间复杂度)。 - 遍历处理库存:逐个遍历
stocks数组里的元素,检查映射对象中是否存在对应_id的订单数量,有就用原库存减去该数量,没有就保持原库存不变。
代码实现(JavaScript)
const orders = [ { "_id": "5e64cfb59726d72129e78aee", "qty": 10 }, { "_id": "5e64d0fe9978d443af7db86c", "qty": 14 } ]; const stocks = [ { "_id": "5e64d0fe9978d443af7db86c", "qty": 600 }, { "_id": "5e64cfb59726d72129e78aee", "qty": 60 }, { "_id": "5e64cfb59726d72129e78ab5", "qty": 650 } ]; // 将orders转为键值对映射,快速查找订单数量 const orderQtyMap = orders.reduce((acc, order) => { acc[order._id] = order.qty; return acc; }, {}); // 处理库存数组,生成结果 const updatedStocks = stocks.map(stock => ({ ...stock, // 保留原对象的所有属性 qty: stock.qty - (orderQtyMap[stock._id] || 0) // 有对应订单则扣减,否则不变 })); console.log(updatedStocks);
输出结果
运行上面的代码后,你会得到期望的结果:
[ { "_id": "5e64cfb59726d72129e78aee", "qty": 50 }, { "_id": "5e64d0fe9978d443af7db86c", "qty": 586 }, { "_id": "5e64cfb59726d72129e78ab5", "qty": 650 } ]
小提示
这种实现方式的时间复杂度是O(n + m)(n是orders的长度,m是stocks的长度),比嵌套循环的O(n*m)高效得多,当数组元素较多时优势会很明显。
内容的提问来源于stack exchange,提问作者Mohamed Maher
相关产品推荐
相关产品推荐

