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

标签 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);

问题:有没有一种方法可以在不创建全局 count 变量的情况下计算“John”的平均分。理想情况下,计数将在 arr.reduce 中的匿名函数内部。

最佳答案

为避免全局变量,请使用标准解决方案,如 IIFEsblock 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/

相关文章:

java - MRUnit reducer 测试: Mismatch in value class

javascript - 如何在 Angular 中等待守卫

javascript - mootools 按文档 ID 加载

javascript - 异步还是同步?当我们设置 Image 对象的 src 属性时?

javascript - 使用 "image"类型下拉框和 vbscript

clojure - 为什么我的传感器功能比使用 ->> 运算符慢?

javascript - Angular 2 HTTP POST

javascript - 使用 .reduce() 将两个值相乘(包括之间的值)的方法

hadoop - 如何增加 hadoop 中 mapreduce 程序中映射器和缩减器的数量?

python - Python 中的列表理解是否以内存有效的方式减少?