如何对嵌套结构JSON中的price值求和并解决重复累加问题
解决price总和重复累加的问题
我来帮你搞定这个问题!你遇到的重复累加问题其实原因很明确:每次重新计算总和前没有重置_sum的初始值,导致旧的总和和新遍历得到的结果叠加在了一起。
问题分析
第一次计算时_sum初始值是0,遍历所有item后得到正确总和;但当你添加新项再次运行代码时,_sum还保留着之前的计算结果,这时候再遍历全量列表累加,就会变成「旧总和 + 新的全量总和」,结果自然就错了。
另外还要注意一个细节:你的JSON里price字段是字符串类型(比如"10"),如果直接累加会触发字符串拼接,这也是潜在的坑,必须转成数字后再计算。
修正方案
方案1:重置累加变量(最直观)
每次计算总和前,先把_sum重置为0,确保每次都是从0开始累加最新的所有item价格:
// 关键:每次计算前重置_sum为0 let _sum = 0; list["data"].forEach((group) => { // 注意要先取到group里的group_object,你之前的代码漏了这一层! group["group_object"]["list_object"].forEach((item) => { // 转成数字后再累加 _sum += Number(item["price"]); }); }); console.log("当前总价格:", _sum);
方案2:使用reduce链式调用(更简洁可靠)
用reduce方法可以避免维护额外的累加变量,每次计算都是独立的,从根源上避免残留值的问题:
const calculateTotalPrice = (data) => { return data.reduce((total, group) => { // 计算当前group下所有item的价格和 const groupTotal = group["group_object"]["list_object"].reduce((sum, item) => { return sum + Number(item["price"]); }, 0); return total + groupTotal; }, 0); }; // 第一次计算 let total = calculateTotalPrice(list["data"]); console.log("初始总价格:", total); // 10+5+15+3=33 // 添加新的group_object后重新计算 list["data"].push({ "group_object": { "id": "3", "seller": "seller3", "list_object": [ {"id": "1", "item_name": "Seller_3_item_1", "price": "20"} ] } }); total = calculateTotalPrice(list["data"]); console.log("添加新项后的总价格:", total); // 33+20=53
额外提示
- 始终确保
price转成数字类型后再计算,避免字符串拼接导致的错误(比如"10"+"5"会得到"105"而不是15)。 - 如果你的场景是频繁添加新项,建议把计算逻辑封装成函数,每次添加后调用函数即可,代码更清晰易维护。
内容的提问来源于stack exchange,提问作者geezcake
相关产品推荐
相关产品推荐

