如何计算数组中元素的总和和平均值?

IT技术 javascript arrays average
2021-01-20 21:29:58

我在添加数组的所有元素以及对它们求平均值时遇到问题。我将如何做到这一点并使用我目前拥有的代码实现它?元素应该按照我在下面的定义进行定义。

<script type="text/javascript">
//<![CDATA[

var i;
var elmt = new Array();

elmt[0] = "0";
elmt[1] = "1";
elmt[2] = "2";
elmt[3] = "3";
elmt[4] = "4";
elmt[5] = "7";
elmt[6] = "8";
elmt[7] = "9";
elmt[8] = "10";
elmt[9] = "11";

// Problem here
for (i = 9; i < 10; i++){
  document.write("The sum of all the elements is: " + /* Problem here */ + " The average of all the elements is: " + /* Problem here */ + "<br/>");
}   

//]]>
</script>
6个回答

我认为更优雅的解决方案:

const sum = times.reduce((a, b) => a + b, 0);
const avg = (sum / times.length) || 0;

console.log(`The sum is: ${sum}. The average is: ${avg}.`);
@zamnuts 我和你在一起,我认为 Thor84no 的评论完全不合时宜——我很高兴被一个发现 array.reduce 太复杂的地方解雇。但是我也不会使用您的代码,因为简单的事实是它在每一步都有一个除法和两个额外的添加,这永远不会像最后的单个除法那样有效
2021-03-12 21:29:58
在 ES2015 中,它更加优雅。 times.reduce((a,b) => (a+b)) / times.length;
2021-03-20 21:29:58
使用累积移动平均线,您可以在 reduce 函数中完成所有这些操作(不需要该sum/times.length步骤):var avg = times.reduce(function(p,c,i){return p+(c-p)/(i+1)},0);
2021-03-23 21:29:58
@furf 5 年后,看起来在许多现代浏览器中,更优雅的“reduce()”更快(或同样快)。在 Chrome 65 中,大多数 firefox reduce 在该测试中表现更好。
2021-03-29 21:29:58
这不适用于 <=IE8,因为它不支持 Array.prototype.reduce() 在developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/查看更多信息...
2021-04-10 21:29:58
var sum = 0;
for( var i = 0; i < elmt.length; i++ ){
    sum += parseInt( elmt[i], 10 ); //don't forget to add the base
}

var avg = sum/elmt.length;

document.write( "The sum of all the elements is: " + sum + " The average is: " + avg );

只需遍历数组,由于您的值是字符串,因此必须先将它们转换为整数。平均值只是值的总和除以值的数量。

@VitoGentile 和 DanD 丑化现代浏览器编译的性能提升代码不应该是最佳实践。
2021-03-16 21:29:58
注意除以 0(elmt.length 可能是 0)
2021-03-27 21:29:58
@BramVanroy 短篇小说:不,它不会每次都设置 'l'。长话短说:DanD 的解决方案是提高性能/速度,因为在每次迭代中检查数组的长度比实际将长度存储在局部变量中并在每次迭代中引用它要慢。
2021-03-31 21:29:58
我要做的唯一改进是替换for(var i = 0; i < elmt.length; i++;)for(var i = 0, l = elmt.length; i < l; i++)
2021-04-01 21:29:58
不要成为那个人或跑题,但在 parseInt() 中包含基数参数是一个很好的做法。我的意思是sum += parseInt(elmt[i], 10);假设 elmt[i] 是基数 10。链接
2021-04-09 21:29:58

ES6

const average = arr => arr.reduce( ( p, c ) => p + c, 0 ) / arr.length;
    
const result = average( [ 4, 4, 5, 6, 6 ] ); // 5
    
console.log(result);

改进: Array.prototype.average = function () { var sum = 0, j = 0; for (var i = 0; i < this.length, isFinite(this[i]); i++) { sum += parseFloat(this[i]); ++j; } return j ? sum / j : 0; };
2021-03-15 21:29:58
请不要扩展不是由您的代码创建的对象。
2021-03-15 21:29:58
更新不适用于: ["RER","4","3re",5,new Object()].average(); 返回 0 而不是预期的 4.5
2021-03-21 21:29:58
当没有长度时,这将严重崩溃
2021-03-28 21:29:58
@JimmyKane 不,它会返回NaN
2021-04-06 21:29:58

使用reduce和ES6计算平均值(mean)

const average = list => list.reduce((prev, curr) => prev + curr) / list.length;

const list = [0, 10, 20, 30]
average(list) // 15
这里有 25% 的差异。没那么糟,我想。
2021-03-15 21:29:58
与带有总和变量jsben.ch/0xUus 的基于循环的简单加法相比,非常非常慢
2021-03-24 21:29:58

一般平均使用单行减少是这样的

elements.reduce(function(sum, a,i,ar) { sum += a;  return i==ar.length-1?(ar.length==0?0:sum/ar.length):sum},0);

特别是提出的问题

elements.reduce(function(sum, a,i,ar) { sum += parseFloat(a);  return i==ar.length-1?(ar.length==0?0:sum/ar.length):sum},0);

一个有效的版本就像

elements.reduce(function(sum, a) { return sum + a },0)/(elements.length||1);

一分钟了解 Javascript Array Reduce http://www.airpair.com/javascript/javascript-array-reduce

正如gotofritz 指出的,似乎 Array.reduce 会跳过未定义的值。所以这是一个修复:

(function average(arr){var finalstate=arr.reduce(function(state,a) { state.sum+=a;state.count+=1; return state },{sum:0,count:0}); return finalstate.sum/finalstate.count})([2,,,6])
请记住,这仅适用于没有空白的数组
2021-03-11 21:29:58
建议:添加未缩小(实际上只是印刷精美)的代码片段版本,以便人们可以阅读它们。我会自己编辑它们,但我不喜欢在那种程度上改变人们的答案。
2021-03-12 21:29:58
elements.length!=0?elements.length:1 也可以这样写: elements.length || 1 更短,更容易阅读。
2021-03-24 21:29:58