【问题标题】:Finding the average of an array using JS [duplicate]使用JS查找数组的平均值[重复]
【发布时间】:2015-04-09 16:47:28
【问题描述】:

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

这是我拥有的数组

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

我一开始以为这个问题的答案是这样的:

let avg = (grades / grades.length) * grades.length
console.log(avg)

但是,这给了我一个 NaN 的输出。

然后我尝试了这个:

for (let grade of grades)
    avg = (grade / grades.length) * grades.length
console.log(avg)

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

所以我有两个问题。 1.为什么我的输出是68?和 2. 有人可以帮我实际找到数组的平均值吗?

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

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

    const average = (array) => array.reduce((a, b) => a + b) / array.length;
    console.log(average([1,2,3,4,5]));

    【讨论】:

    • (array) => 部分不需要
    • 需要(array) => 部分才能为我工作!
    • (array)=> 如果要使其成为独立功能,则需要;没有它是一个值(假设您有一个现有的array 值并使用average 而不是average(...) 调用。
    • 有人介意解释一下它是如何工作的吗?
    • 我无法解释它,因为它涉及到 javascript 语法的工作原理等,这很难解释......但我可以为你更清楚地重写它,所以也许你可以理解它在做什么@987654328 @这里的关键是reduce函数会遍历myArray并将值相加并存储在total中,然后返回total
    【解决方案2】:

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

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

    你得到 68 作为结果的原因是因为在你的循环中,你不断地覆盖你的平均值,所以最终值将是你最后一次计算的结果。而且你的除法和乘法除以 Grades.length 相互抵消。

    【讨论】:

    • 我想指出 JavaScript 中的一个问题。如果您将变量总计定义为未定义,您将得到 NaN。 let total; let grades = [90, 30, 40, 50, 60]; for (let i = 0; i &lt; grades.length; i++) { total += grades[i]; } let avg = total / grades.length; console.log(avg)
    • 我的code 没有被格式化?
    • 有些人建议对这篇文章进行编辑,以使代码更简洁/更好。我的目的不是提供在 javascript 中找到数组平均值的最佳方法,而是尽可能地贴近 op 的代码以指出他们做错了什么。
    【解决方案3】:

    对于您问题的第二部分,您可以在这里使用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);

    其他答案已经很好地了解了你为什么得到 68,所以我不会在这里重复。

    【讨论】:

    • 我可以建议 ES7 语法:const getAvg = grades =&gt; grades.reduce((p,c) =&gt; p+c) / grades.length
    • 如果您打算使用reduce,那么您应该使用它的全部功能。 array.reduce((all, one, _, src) =&gt; all += one / src.length, 0)
    【解决方案4】:

    MacGyver 方式,只为 lulz

    var a = [80, 77, 88, 95, 68];
    
    console.log(eval(a.join('+'))/a.length)

    【讨论】:

    • 虽然很有趣,但我相信有人可能会使用它或说“哦!这个 eval 函数看起来很强大!',所以我还是不赞成 :)
    • 为什么对 eval 的使用不好?没有明显的安全问题 => 赞成。
    • @DanielW。因为 eval 总是不受欢迎,因为具有基本经验的开发人员可能只是看到 eval 并开始在任何地方使用它——这当然是一种风险。这通常被认为是不好的做法。
    • 太美了。
    【解决方案5】:

    没有内置函数,但你可以用它来求和,

    Array.prototype.sum = function() {
        return this.reduce(function(a,b){return a+b;});
    };
    

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

    var arr = [1,2,3,4,5]
    console.log(arr.sum() / arr.length)
    

    【讨论】:

      【解决方案6】:

      可以简单地用一个reduce操作来完成,如下所示;

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

      【讨论】:

      • 像弗拉德的回答一样,这种方法会产生舍入误差。如果你尝试平均[1,1,1,1,1,1],你不会得到 1。
      • 这是正确处理数组为空情况的唯一解决方案,其他答案将由于除以0错误而导致NaN
      【解决方案7】:
      var total = 0
      grades.forEach(function (grade) {
          total += grade        
      });
      console.log(total / grades.length)
      

      【讨论】:

      • 此代码不起作用。比如gradesTotal在哪里使用?
      • 哎呀!之前退格有点疯狂;)
      【解决方案8】:

      你能做的平均功能是:

      const getAverage = (arr) => arr.reduce((p, c) => p + c, 0) / arr.length
      

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

      const _ = require('lodash')
      const getAverage = (arr) => _.chain(arr)
       .sum()
       .divide(arr.length)
       .round(1)
       .value()
      

      【讨论】:

        【解决方案9】:

        您可以使用 javascript 的 map/reduce 函数来求平均值。 Reduce 会对它们求和,map 会找到平均值。

        var avg = grades.map((c, i, arr) => c / arr.length).reduce((p, c) => c + p);
        

        【讨论】:

        • 不幸的是,这种方法会产生舍入错误。例如[ 1, 1, 1, 1, 1, 1 ].map((c, i, arr) =&gt; c / arr.length).reduce((p, c) =&gt; c + p) 将给出 0.9999999999999999 的值,而不是 1。
        猜你喜欢
        • 2013-10-09
        • 1970-01-01
        • 1970-01-01
        • 2020-09-06
        • 1970-01-01
        • 2021-04-08
        • 1970-01-01
        • 2015-01-15
        相关资源
        最近更新 更多