Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript平均值_Javascript_Arrays - Fatal编程技术网

Javascript平均值

Javascript平均值,javascript,arrays,Javascript,Arrays,我正在努力学习Javascript。我构建了以下代码来从一组数字中找到平均值。除了最后一个返回值始终为NaN之外,它可以正常工作。我不明白为什么。如果我把这部分移到块外,它似乎完全忘记了变量和应该等于什么。是否有某种全局变量类型的等价物我应该用于JS var average = function(myarray) { sum = 0; for (counter = 0; counter <= myarray.length; counter++) { sum

我正在努力学习Javascript。我构建了以下代码来从一组数字中找到平均值。除了最后一个返回值始终为NaN之外,它可以正常工作。我不明白为什么。如果我把这部分移到块外,它似乎完全忘记了变量和应该等于什么。是否有某种全局变量类型的等价物我应该用于JS

var average = function(myarray) {
    sum = 0;
    for (counter = 0; counter <= myarray.length; counter++) {
        sum = sum + myarray[counter];
        average = sum / myarray.length;
        console.log(average);
    };
}

average([1, 2, 3])
var average=函数(myarray){
总和=0;

for(counter=0;counter
myarray[myarray.length]
未定义的
,这会使您的计算沉迷于
NaN
(不是数字)

把它改成

for(counter = 0; counter < myarray.length; counter ++) {
// ...
}
for(计数器=0;计数器
由于您刚刚开始学习,您应该知道,在类似这样的for循环中不使用.length是一种很好的做法。这会导致代码必须检查每个循环中数组的长度。请记住。length返回数组中的元素数;但数组索引从0开始

for(var counter = 0, length = myarray.length; counter < length; counter++){
}
for(var counter=0,length=myarray.length;counter
这是正确的方法。

改变

counter <= myarray.length
计数器
  • 不要在使用变量时不使用
    var
    关键字声明它们,否则它们将成为全局属性

  • JavaScript数组是基于零索引的数组。因此,如果数组的大小为3,那么第一个元素将使用0访问,最后一个元素使用2访问。JavaScript非常宽容,因此当您访问数组中无效索引处的元素时,它只会返回
    未定义的

  • 在迭代过程中,您将使用
    average
    值替换当前函数对象。因此,对
    average
    的后续调用将失败,因为
    average
    不再是函数对象

  • 一个好的做法是让函数返回计算值,而不是打印值,这样它就不会违反规则

  • 就你而言

    for (counter = 0; counter <= myarray.length; counter++) {
    
    因此,您需要更改代码,如下所示

    function Average(myarray) {
        var sum = 0, counter;
        for (counter = 0; counter < myarray.length; counter++) {
            sum = sum + myarray[counter];
        }
        return sum / myarray.length;
    }
    
    function Average(myarray) {
        var sum = 0;
        myarray.forEach(function(currentNumber) {
            sum += currentNumber;
        });
        return sum / myarray.length;
    }
    
    function Average(myarray) {
        return myarray.reduce(function(sum, currentNumber) {
            return sum + currentNumber;
        }, 0) / myarray.length;
    }
    
    更好的是,你可以这样计算总和

    function Average(myarray) {
        var sum = 0, counter;
        for (counter = 0; counter < myarray.length; counter++) {
            sum = sum + myarray[counter];
        }
        return sum / myarray.length;
    }
    
    function Average(myarray) {
        var sum = 0;
        myarray.forEach(function(currentNumber) {
            sum += currentNumber;
        });
        return sum / myarray.length;
    }
    
    function Average(myarray) {
        return myarray.reduce(function(sum, currentNumber) {
            return sum + currentNumber;
        }, 0) / myarray.length;
    }
    

    可以按如下方式计算数字数组的平均值:

    var avg = c => c.reduce((a,b) => a +b) / c.length;
    avg([1,2,3])
    

    您有
    也应该将平均值的计算放在
    for
    循环结束后,因为它只需要计算一次。此外,
    sum/myarray.length
    将不是平均值,
    sum/(counter+1)
    是(如果您在运行平均值)。如果您只想要总平均值,@jfriend00是您的朋友。而且,您正在尝试将平均值分配给函数。我猜您应该返回平均值。最好的答案是用文字描述更改的内容和原因。也可以在数组上使用
    .reduce()