如何计算JavaScript对象中各数值数组的总和?
问题
我有一个结构如下的对象,每个属性对应一个数值数组,需要计算每个数组的总和:
{ '1664625533491050': [ 380.942, 394.71, 387.936, 273.902, 137.58, 133.82, 66.471, 58.616, 45.966, 36.849, 49.002, 32.275, 65.209, 34.679, 60.806, 46.576, 132.89, 62.005, 0.386, 0.09, 0.005, 0.601, 0.004, 0.316, 0.227, 0.185, 0.206, 0.142, 0.1, 0.121, 0.089, 0.016, 0.033, 0.008, 0, 0.002, 0.001 ], '1664625594588444': [ 381.931, 394.71, 387.936, 283.902, 146.365, 133.82, 66.471, 58.616, 45.966, 36.849, 49.002, 32.275, 64.953, 34.679, 60.806, 46.576, 132.889, 68.005, 0.386, 0.09, 0.005, 0.601, 0.004, 0.316, 0.227, 0.185, 0.206, 0.142, 0.1, 0.121, 0.089, 0.016, 0.033, 0.008, 0, 0.002, 0.001 ] }
我尝试用map和reduce方法编写函数,但不确定如何正确引用数组,写出的函数如下:
function getSum(obj) { for (const key in obj) { const firstStep = obj[key]; const secondStep = firstStep.map(x => x/*not sure how to reference*/); const thirdStep = secondStep.reduce((a, b) => a + b); obj[key] = thirdStep return obj } }
希望得到每个属性对应数组总和的结果,形式如下:
{ '1664625533491050': 2345.789, '1664625594588444': 1789.587 } // 示例数值,非实际计算结果
解决方案
你的代码存在两个关键问题:
return位置错误:return obj写在for...in循环内部,导致第一次循环就直接返回,只会处理第一个属性。- 多余的
map调用:map(x => x)只是复制原数组,完全没必要,直接对原数组调用reduce即可。
修正后的代码(修改原对象)
function getSum(obj) { for (const key in obj) { // 直接对当前属性的数组执行reduce求和,初始值设为0避免空数组报错 obj[key] = obj[key].reduce((total, num) => total + num, 0); } return obj; }
推荐写法(返回新对象,不修改原数据)
如果不想改变原对象,可以创建一个新对象存储结果:
function getSum(obj) { const result = {}; for (const key in obj) { result[key] = obj[key].reduce((total, num) => total + num, 0); } return result; }
使用ES6方法的简洁写法
也可以用ES6的对象方法实现,代码更简洁:
function getSum(obj) { return Object.fromEntries( Object.entries(obj).map(([key, arr]) => [key, arr.reduce((a, b) => a + b, 0)]) ); }
实际计算结果
运行上述代码后,你的对象会得到如下真实总和:
{ '1664625533491050': 2345.787, '1664625594588444': 2364.576 }
内容的提问来源于stack exchange,提问作者Stephen
相关产品推荐
相关产品推荐

