如何使用javascript reduce函数计算满足特定条件的项目的平均值?

Ran*_*l D 9 javascript reduce

假设我有以下对象数组:

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);
Run Code Online (Sandbox Code Playgroud)

问题:有没有办法在不创建全局计数变量的情况下计算"John"的平均分数.理想情况下,计数将在arr.reduce中的匿名函数内部.

Ber*_*rgi 6

要避免全局变量,请使用IIFE块作用域等标准解决方案.但是我想你正在寻找一种避免可变计数器的方法.

最简单的是事先放弃所有其他人:

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;
Run Code Online (Sandbox Code Playgroud)

但是你也可以使用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);
Run Code Online (Sandbox Code Playgroud)

(使用ES6对象属性简写和解构)

  • 我认为你的意思是'johns.reduce`而不是'àrr.reduce`!! (2认同)