如何在JavaScript中按用户统计JSON数组内的商品价格总和?
解决用户商品价格总和统计问题
嗨,我看了你的代码,问题出在priceSum变量没有在每个用户的循环开始前重置——它一直在累加所有用户的商品价格,自然没法区分每个用户的单独总和啦。
问题根源
你原来的代码里,priceSum是在函数最外层定义的,每次循环处理新用户时,它不会自动归零,导致第二个用户的总和是第一个用户加第二个用户的价格,第三个用户的总和是前三个的累加,这就完全不符合你的需求了。
修正后的循环版本
把priceSum的定义移到外层循环(处理每个用户的循环)内部,这样每次处理新用户时,都会重新初始化priceSum为0,确保每个用户的价格总和是独立计算的:
var json = [ { "name" : " KYLE 1", "addr" : " SEOUL", "buyproducts" : [ { "prodname": "prod1", "price": 100.2, "date": "2003-01-04"},{ "prodname": "prod2", "price": 100.2, "date": "2003-06-04"},{ "prodname": "prod3", "price": 100.2, "date": "2003-08-04"} ]}, { "name" : " KYLE 2", "addr" : " SEOUL", "buyproducts" : [ { "prodname": "prod4", "price": 13.2, "date": "2003-03-04"},{ "prodname": "prod5", "price": 633.2, "date": "2003-07-04"},{ "prodname": "prod6", "price": 542.2, "date": "2003-01-04"} ]}, { "name" : " KYLE 3", "addr" : " SEOUL", "buyproducts" : [ { "prodname": "prod1", "price": 75.2, "date": "2003-01-04"},{ "prodname": "prod2", "price": 35.2, "date": "2004-07-04"},{ "prodname": "prod3", "price": 52.2, "date": "2005-02-04"} ]} ]; var totalCost = function(arr){ var array = []; // 把priceSum移到外层循环内,每个用户都重新初始化 for (var i = 0; i < arr.length; i++){ var priceSum = 0; for (var j = 0; j < arr[i].buyproducts.length; j++){ priceSum += arr[i].buyproducts[j].price; } array.push(priceSum); console.log(arr[i].name + ": " + priceSum); } // 返回结果数组,方便后续使用 return array; }; totalCost(json);
运行这段代码后,你就能得到正确的结果:
- KYLE 1: 300.6
- KYLE 2: 1188.6
- KYLE 3: 162.6
更简洁的现代JS写法
如果你习惯用更简洁的数组方法,也可以用map和reduce来实现,代码可读性更高:
var totalCost = function(arr){ return arr.map(user => { // 用reduce计算当前用户的商品总价,初始值设为0 const sum = user.buyproducts.reduce((total, product) => total + product.price, 0); console.log(`${user.name}: ${sum}`); return sum; }); }; totalCost(json);
这个版本里,map遍历每个用户,reduce专门用来计算每个用户的商品价格总和,每个用户的计算都是独立的,完全不会出现累加混乱的问题。
内容的提问来源于stack exchange,提问作者Kim Kyle
相关产品推荐
相关产品推荐

