使用JS查找数组的平均值

kdw*_*r89 24 javascript arrays

我一直在寻找并且没有找到关于堆栈溢出的简单问题和答案,寻找查找数组的平均值.

这是我拥有的数组

var grades = [80, 77, 88, 95, 68];
Run Code Online (Sandbox Code Playgroud)

我首先想到这个问题的答案是这样的:

var avg = (grades / grades.length) * grades.length
console.log(avg)
Run Code Online (Sandbox Code Playgroud)

然而,这给了我一个NaN的输出.

那么我试过这个:

for ( var i = 0; i < grades.length; i ++){
    var avg = (grades[i] / grades.length) * grades.length
}
console.log(avg)
Run Code Online (Sandbox Code Playgroud)

这给了我68的输出.(我不知道为什么).

所以我有两个问题.1.为什么输出68?2.有人能帮助我实际找到阵列的平均值吗?

bwr*_*oga 34

您可以通过添加所有元素然后除以元素数来计算平均值.

var total = 0;
for(var i = 0; i < grades.length; i++) {
    total += grades[i];
}
var avg = total / grades.length;
Run Code Online (Sandbox Code Playgroud)

你得到68作为结果的原因是因为在你的循环中,你会一直覆盖你的平均值,所以最后的值将是你上次计算的结果.你的除法和乘以grade.length相互抵消.

更新:;在最后一行代码示例中添加以避免错误.


And*_*ndy 23

对于问题的第二部分,您可以reduce在此处使用效果良好:

const grades = [80, 77, 88, 95, 68];

function getAvg(grades) {
  const total = grades.reduce((acc, c) => acc + c, 0);
  return total / grades.length;
}

const average = getAvg(grades);
console.log(average);
Run Code Online (Sandbox Code Playgroud)

DEMO

其他答案已经很清楚你为什么得到68,所以我不会在这里重复.

  • 如果要使用`reduce`,那么应该使用它的全部功能。array.reduce((all,one,_,src)=&gt;全部+ =一个/ src.length,0) (4认同)

Aus*_*tin 19

使用ES6,您可以将Andy的解决方案转变为单线程:

let average = (array) => array.reduce((a, b) => a + b) / array.length;
console.log(average([1,2,3,4,5]));
Run Code Online (Sandbox Code Playgroud)

  • 不需要 `(array) =&gt;` 部分 (4认同)
  • 如果你想让它成为一个独立的函数,则需要`(array)=&gt;`;如果没有它,它就是一个值(假设您有一个现有的“数组”值,并使用“average”而不是“average(...)”来调用。 (3认同)

pie*_*e6k 13

一个班轮挑战接受了

const average = arr => arr.reduce((sume, el) => sume + el, 0) / arr.length;

然后

average([1,2,3,4]); // 2.5


Mih*_*hai 8

MacGyver方式,仅适用于lulz

var a = [80, 77, 88, 95, 68];

console.log(eval(a.join('+'))/a.length)
Run Code Online (Sandbox Code Playgroud)

  • “仅适用于lulz”可以保护您免受大量的反对:) (13认同)
  • @丹尼尔W。因为 eval 总是不受欢迎,因为具有基本经验的开发人员可能会简单地看到 eval 并开始在任何地方使用它 - 这当然是一种风险。这通常被认为是不好的做法。 (5认同)
  • 为什么这是 eval 的错误用法?没有明显的安全问题 =&gt; 赞成。 (3认同)
  • 虽然有趣,但我相信有人可能会使用它或说“哦!这个评估函数看起来非常强大!',所以我还是会投票:) (2认同)

chr*_*con 6

没有内置功能,但你可以使用它来获得总和,

Array.prototype.sum = function() {
    return this.reduce(function(a,b){return a+b;});
};
Run Code Online (Sandbox Code Playgroud)

然后除以数组长度,例如:

var arr = [1,2,3,4,5]
console.log(arr.sum() / arr.length)
Run Code Online (Sandbox Code Playgroud)


Tyl*_*ley 5

var total = 0
grades.forEach(function (grade) {
    total += grade        
});
console.log(total / grades.length)
Run Code Online (Sandbox Code Playgroud)


Red*_*edu 5

只需按以下一个简单的reduce操作即可完成;

var avg = [1,2,3,4].reduce((p,c,_,a) => p + c/a.length,0);
console.log(avg)
Run Code Online (Sandbox Code Playgroud)

  • 就像弗拉德的答案一样,这种方法会产生舍入误差。如果您尝试对“[1,1,1,1,1,1]”进行平均,您将不会得到 1。 (2认同)

Win*_*ers 5

您可以执行的平均功能是:

const getAverage = (arr) => arr.reduce((p, c) => p + c, 0) / arr.length
Run Code Online (Sandbox Code Playgroud)

另外,我建议使用流行的开源工具,例如。Lodash

const _ = require('lodash')
const getAverage = (arr) => _.chain(arr)
 .sum()
 .divide(arr.length)
 .round(1)
 .value()
Run Code Online (Sandbox Code Playgroud)

  • Lodash 很棒...但是如果您要使用 lodash,请使用 lodash: `_.mean([4, 2, 8, 6]);` (另请参阅:`_.meanBy` https://lodash .com/docs/4.17.15#meanBy) (2认同)