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

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

当前回答

首先定义我们计划使用的所有变量。您将注意到,对于数字数组,我使用了[]的文字符号,而不是构造函数方法array()。此外,我使用了一个更短的方法来将多个变量设置为0。

var numbers = [], count = sum = avg = 0;

接下来,我用0到11的值填充空数字数组。这是为了回到最初的起点。注意我是如何推入数组count++的。这将推动count的当前值,然后在下一次增加该值。

while ( count < 12 )
    numbers.push( count++ );

最后,我为数字数组中的每个数字执行一个函数。这个函数一次处理一个数字,我在函数体中将其标识为“n”。

numbers.forEach(function(n){
  sum += n; 
  avg = sum / numbers.length;
});

最后,我们可以将sum值和avg值输出到控制台,以便查看结果:

// Sum: 66, Avg: 5.5
console.log( 'Sum: ' + sum + ', Avg: ' + avg );

在http://jsbin.com/unukoj/3/edit上看到它的行动

其他回答

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

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更正确,在特定的用例中可能有用。

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

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

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

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

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

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

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

我只是基于Abdennour TOUMI的回答。原因如下:

1)。我同意Brad的观点,我不认为扩展我们没有创建的对象是一个好主意。

2)数组。长度在javascript中是完全可靠的,我更喜欢数组。因为a=[1,3];a[1000]=5;,现在a.length将返回1001。

function getAverage(arry){
    // check if array
    if(!(Object.prototype.toString.call(arry) === '[object Array]')){
        return 0;
    }
    var sum = 0, count = 0; 
    sum = arry.reduce(function(previousValue, currentValue, index, array) {
        if(isFinite(currentValue)){
            count++;
            return previousValue+ parseFloat(currentValue);
        }
        return previousValue;
    }, sum);
    return count ? sum / count : 0; 
};

我觉得我们可以

var k=elmt.reduce(function(a,b){return parseFloat(a+parseFloat(b));})
var avg=k/elmt.length; 
console.log(avg);

我使用了两次parseFloat,因为 当 1)你添加(a)9+b(“1”)数字,结果将是“91”,但我们想要加法。所以我使用了parseFloat

2)当添加(a)9+parseFloat(“1”)发生,虽然结果将是“10”,但它将是字符串,我们不想要的,所以我再次使用parseFloat。

我希望我讲清楚了。欢迎提出建议