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

JSON数组按唯一ID汇总qty值异常问题排查

问题分析与修复

你的问题出在qty变量没有在每次处理新ID时重置,导致前一个ID的累加值被带到了下一个ID的计算中。我们来拆解一下:

当处理ID 123时,qty从0累加得到40,这时候qty的值是40。接下来处理ID 456时,你没有把qty重新设为0,而是直接在40的基础上继续加30+30+30,最终得到40+90=130,这就是为什么结果不符合预期。另外,内层循环里重复声明var qty属于冗余操作,反而容易混淆作用域。

修复方案1:重置qty变量

把qty的初始化移到外层循环内部,确保每个ID的累加都从0开始:

const data = [{ id: 123, qty: 20 }, { id: 456, qty: 30 }, { id: 123, qty: 20 }, { id: 456, qty: 30 }, { id: 456, qty: 30 }];
const priceMap = new Map();
const dataArray = [123, 456];

for (let i = 0; i < dataArray.length; i++) {
  // 每次处理新ID时,重置qty为0
  let qty = 0;
  for (let j = 0; j < data.length; j++) {
    if (dataArray[i] === data[j].id) {
      qty += data[j].qty;
      priceMap.set(dataArray[i], qty);
    }
  }
}

console.log(priceMap.get(123), priceMap.get(456)); // 输出: 40 90

修复方案2:更高效的遍历方式(无需额外的dataArray)

其实你不需要单独维护dataArray,直接遍历原始的data数组,通过Map的get方法判断是否已存在该ID,不存在则默认设为0,然后累加即可,代码更简洁高效:

const data = [{ id: 123, qty: 20 }, { id: 456, qty: 30 }, { id: 123, qty: 20 }, { id: 456, qty: 30 }, { id: 456, qty: 30 }];
const priceMap = new Map();

data.forEach(item => {
  // 获取当前ID的现有数量,不存在则为0
  const currentQty = priceMap.get(item.id) || 0;
  priceMap.set(item.id, currentQty + item.qty);
});

console.log(priceMap.get(123), priceMap.get(456)); // 输出: 40 90

这样就完美解决了你的问题,两种方案都能得到预期的结果,第二种方案的时间复杂度更低(O(n) vs 原代码的O(n*m)),推荐使用。

内容的提问来源于stack exchange,提问作者soum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 19:57:28