如何按Item分组统计订单数组中Amount总和?代码异常排查
问题描述
现有包含订单对象的数组,需求是按Order.Item字段分组,统计对应Order.Amount的总和:
const sellingInfo = [ {"OrderReceiverId":"6698eea782e24cc9d42eab7f","Order":{ "CustomerId":"669aa55079cce2e96f9a7e69","CustomerName":"Erigbemi","Date":"2024/07/19","TrackingId":"43035","Status":"Processing","Amount":{"$numberInt":"25000"},"Item":"Orange" }}, {"OrderReceiverId":"6698eea782e24cc9d42eab7f","Order":{ "CustomerId":"669aa55079cce2e96f96t77","CustomerName":"James","Date":"2024/07/19","TrackingId":"42335","Status":"Processing","Amount":{"$numberInt":"15000"},"Item":"Tomatoes" }}, {"OrderReceiverId":"6698eea782e24cc9d42eab7f","Order":{ "CustomerId":"669aa55079cce2e96f9a7e69","CustomerName":"Erigbemi","Date":"2024/07/19","TrackingId":"22235","Status":"Processing","Amount":{"$numberInt":"15000"},"Item":"Tomatoes" }} ];
预期输出:
{ "Orange": 25000, "Tomatoes": 30000 }
尝试的JavaScript代码:
let itm = {}; sellingInfo.forEach(order => { const item = order.Order.Item; const amt = order.Order.Amount; if(!itm[item]){ itm[item] = amt; } itm[item] += amt; }) res.json(itm);
得到错误输出:
{ "Orange": 50000, "Tomatoes": 45000 }
问题分析
- 数值提取错误:
order.Order.Amount是包含$numberInt字段的对象,直接赋值或相加会导致类型异常,必须先提取字符串并转换为整数。 - 逻辑重复累加:当前代码中,无论是否完成分组初始化,都会执行一次
itm[item] += amt。以Orange为例,第一次循环初始化itm["Orange"] = 25000后,又立即执行累加操作,导致结果翻倍;Tomatoes的第三个订单则在已有30000的基础上再次累加15000,最终得到45000。
修复后的代码
let itm = {}; sellingInfo.forEach(order => { const item = order.Order.Item; // 提取Amount的数值并转为整数 const amt = parseInt(order.Order.Amount.$numberInt, 10); if (!itm[item]) { // 初始化分组总和为0 itm[item] = 0; } // 仅执行一次累加 itm[item] += amt; }) res.json(itm);
也可以用更简洁的短路赋值逻辑:
let itm = {}; sellingInfo.forEach(order => { const item = order.Order.Item; const amt = parseInt(order.Order.Amount.$numberInt, 10); // 若分组不存在则初始化为0,再累加当前金额 itm[item] = (itm[item] || 0) + amt; }) res.json(itm);
执行后将得到正确的分组求和结果。
内容的提问来源于stack exchange,提问作者Osemu Aimiosior
相关产品推荐
相关产品推荐

