You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 01:05:22