我有问题添加一个数组的所有元素以及平均它们。我将如何做到这一点,并实现它与我目前的代码?元素的定义如下所示。

<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>

当前回答

这是我的一个简单的求平均值的新手方法。希望这能帮助到一些人。

function numAvg(num){
    var total = 0;
    for(var i = 0;i < num.length; i++) { 
        total+=num[i];
    }
    return total/num.length;
}

其他回答

将for循环计数器设置为0....你得到了元素9,然后你就完成了。其他答案都是基础数学。使用一个变量来存储你的和(需要将字符串转换为整数),然后除以你的数组长度。

除非我遗漏了什么,否则到目前为止的每个解都使用列表的长度来计算求和后的平均值。

这种方法有一个缺点,稍微修改一下,但仍然简单的算法可以解决这个缺点。

它的缺点是,通过对所有数字求和,假设不会出现溢出。如果您有很多非常大的数字,并且将它们全部加起来,它们可能会超过数据类型可以容纳的最大大小。

一个更好的方法是简单地计算平均值,而不是把它加起来,然后除以最后的长度:

function getAvg(values) {
    return values.reduce((m, x, i) => m + (x - m) / (i + 1), 0)
}

道具Knuth的“计算机编程的艺术”卷2。

让我们假设我们有一个这样的整数数组:

var values = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];

用下面的公式求平均值

A = (1 / n)Σ喜(i = 1到n) ...同在所以:x1/n + x2/n + 0 ..+ n / n

我们将当前值除以值的数量,并将之前的结果添加到返回值中。

reduce方法签名为

reduce(callback[,default_previous_value])

reduce回调函数接受以下参数:

p:结果 之前计算的 c:当前值(来自当前索引) i:当前数组元素的索引值 a:当前缩减Array

第二个reduce的参数是默认值…(用于数组为空的情况)。

所以平均减法是:

var avg = values.reduce(function(p,c,i,a){return p + (c/a.length)},0);

如果你喜欢,你可以创建一个单独的函数

function average(p,c,i,a){return p + (c/a.length)};
function sum(p,c){return p + c)};

然后简单地引用回调方法签名

var avg = values.reduce(average,0);
var sum= values.reduce(sum,0);

或增强阵列原型直接..

Array.prototype.sum = Array.prototype.sum || function (){
  return this.reduce(function(p,c){return p+c},0);
};

可以在每次调用reduce方法时对该值进行除法。

Array.prototype.avg = Array.prototype.avg || function () {
  return this.reduce(function(p,c,i,a){return p+(c/a.length)},0);
};

或者更好,使用之前定义的array . prototype .sum()

方法,优化我只调用一次事业部的过程:)

Array.prototype.avg = Array.prototype.avg || function () {
  return this.sum()/this.length; 
};

然后在作用域的任意Array对象上:

[2, 6].avg();// -> 4
[2, 6].sum();// -> 8

注意:在我看来,一个返回NaN愿望的空数组比0更正确,在特定的用例中可能有用。

你也可以使用lodash, _.sum(数组)和_.mean(数组)在数学部分(也有其他方便的东西)。

_.sum([4, 2, 8, 6]);
// => 20
_.mean([4, 2, 8, 6]);
// => 5

不是最快的,但最短的,在一行中使用map() & reduce():

var average = [7,14,21].map(function(x,i,arr){return x/arr.length}).reduce(function(a,b){return a + b})