假设我有以下对象数组:
var arr = [
{"name": "John", "score": "8.8"},
{"name": "John", "score": "8.6"},
{"name": "John", "score": "9.0"},
{"name": "John", "score": "8.3"},
{"name": "Tom", "score": "7.9"}
];
var count = 0;
var avgScore = arr.reduce(function (sum,person) {
if (person.name == "John") {
count+=1;
return sum + parseFloat(person.score);
}
return sum;
},0)/count);
问题:有没有一种方法可以在不创建全局 count 变量的情况下计算“John”的平均分。理想情况下,计数将在 arr.reduce 中的匿名函数内部。
最佳答案
为避免全局变量,请使用标准解决方案,如 IIFEs或 block scopes .但是我猜你正在寻找一种方法来避免可变计数器。
最简单的方法是事先放下所有其他人:
var johns = arr.filter(function(person) {
return person.name == "John";
});
var avgScore = johns.reduce(function (sum, person) {
return sum + parseFloat(person.score);
}, 0) / johns.length;
但是您也可以使用一个 count
,它与对象中的总和一起传递:
var stats = arr.reduce(function ({count, sum}, person) {
return (person.name == "John")
? {count: count+1, sum: sum + parseFloat(person.score)}
: {count, sum};
}, {count:0, sum:0})
var avgScore = stats.sum / stats.count);
(使用 ES6 对象属性简写和解构)
关于javascript - 如何使用javascript reduce函数计算满足特定条件的项目的平均值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42146272/