JavaScript数组值未更新问题求助:库存扣减逻辑错误排查
解析JavaScript数组更新导致订单生成不符合预期的问题
问题场景
这段代码旨在根据请求的商品数量从库存中扣减并生成订单,但更新request.quantities的元素值后,后续引用仍获取原始值,导致订单结果不符合预期。
预期输出
[{name: 'apple', batch: '12345', quantity: 5},{name: 'orange', batch: '23456', quantity: 10},{name: 'banana', batch: '34567', quantity: 3},{name: 'banana', batch: '99999', quantity: 12}]
实际输出
[{name: 'apple', batch: '12345', quantity: 5},{name: 'orange', batch: '23456', quantity: 10},{name: 'banana', batch: '34567', quantity: 3},{name: 'banana', batch: '99999', quantity: 15}]
代码片段
let request = {products:['apple', 'orange', 'banana'], quantities:[5, 10, 15]}; let stock = [{name: 'apple', batch: '12345', quantity: 50},{name: 'orange', batch: '23456', quantity: 1000},{name: 'banana', batch: '34567', quantity: 3},{name: 'banana', batch: '99999', quantity: 500}]; let order = []; for (let i = 0; i < request.products.length; i++) { for (let j = 0; j < stock.length; j++) { if (request.products[i] == stock[j].name) { if (stock[j].quantity - request.quantities[i] > 0) { order.push({name: request.products[i], batch: stock[j].batch, quantity: request.quantities[i]}); stock[j].quantity = stock[j].quantity - request.quantities[i]; request.quantities[i] = 0; } else { order.push({name: request.products[i], batch: stock[j].batch, quantity: stock[j].quantity}); stock[j].quantity = 0; request.quantities[i] = request.quantities[i] - stock[j].quantity; } } } }
问题根源
问题出在else分支的执行顺序上:
- 处理
banana的第一个批次(库存3)时,进入else分支,先将库存的3加入订单,随后立即把stock[j].quantity设为0 - 计算剩余需求时,使用的是已经被设为0的
stock[j].quantity,导致request.quantities[i] = 15 - 0 = 15,等于没有更新剩余需求 - 循环到
banana的第二个批次时,request.quantities[i]还是原始的15,因此直接将15加入订单,而非预期的15-3=12
修复方案
调整else分支的执行逻辑,先保存当前要扣减的库存数量,再更新剩余需求:
else { const takeQuantity = stock[j].quantity; order.push({name: request.products[i], batch: stock[j].batch, quantity: takeQuantity}); stock[j].quantity = 0; request.quantities[i] = request.quantities[i] - takeQuantity; }
这样处理后,剩余需求会正确计算为15-3=12,下一个批次就会扣减12,符合预期输出。
内容的提问来源于stack exchange,提问作者Spencer Brereton
相关产品推荐
相关产品推荐

