我尝试使用下面的函数返回array1
中所有元素的平均值,但结果仍然是null
。我似乎无法弄明白为什么。
var array1 = [46,73,-18,0,-442,779,5,1400];
var arrayAverage = function(arrayavg) {
for (var average = 0,answer=0, arrayavg = arrayavg.length;array1 > answer;answer++)
average +=parseInt(arrayavg[answer]);
var calc = average/arrayavg.length;
return calc
};
答案 0 :(得分:2)
你需要在for循环后加上括号
我太快了,不能回答。
您正在将传递的数组重新分配给传递的数组的长度。
arrayavg = arrayavg.length
这打破了一切。
答案 1 :(得分:2)
有很多错误,我没有时间指出它们,希望以下就足够了:
var array1 = [46,73,-18,0,-442,779,5,1400];
var arrayAverage = function(arrayavg) {
我不知道你为什么使用函数表达式而不是函数声明。它不会影响问题,但需要编写更多代码。给变量名称表达它们的用途也很好,所以假设函数需要一个数组:
function arrayAverage(array) {
然后:
for (var average = 0,answer=0, arrayavg = arrayavg.length;array1 > answer;answer++)
将所有这些变量声明堆积到for条件中并不是一个好主意,更好地分离关注点并且只创建您需要的变量:
var total = 0;
现在迭代数组以获得总值。 ' {'括号可以省略,但包含它们更清楚:
for (var i=0, iLen=array.length; i<iLen; i++) {
total += array[i];
}
现在计算平均值并将其返回到一个语句中:
return total/iLen;
}
console.log(arrayAverage(array1)); // 230.375
答案 2 :(得分:1)
在您已分配arrayavg=arrayavg.length
的for循环中,您正在访问average+=arrayavg[answer]
。 arrayavg现在是一种原始类型。它将返回undefined。
你的循环条件是array1 > answer
array1是一个数组。你不能比较那样。它会返回false。
修改后的代码。
var array1 = [46,73,-18,0,-442,779,5,1400];
var arrayAverage = function(arrayavg) {
var sum=0;
for (var i=0;i<arrayavg.length;i++)
sum +=parseInt(arrayavg[i]);
return sum/arrayavg.length;
};
答案 3 :(得分:0)
你的代码在for循环中有两个问题。
for (var average = 0,answer=0, arrayavg = arrayavg.length;array1 > answer;answer++)
^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
首先,您在尝试读取数组索引的下一行中将arrayavg
设置为arrayavg的长度BUT。那么你用数字覆盖了数组!不会发生。
第二个问题是您将数组'array1'与数字'answer'进行比较。那张支票做了什么?不是你认为它会发生什么。你想检查长度,但是你不想检查传入的数组,而不是硬编码的那个吗?
答案 4 :(得分:0)
您正在for循环中将数字与数组进行比较。当answer
与array1
长度相同时,您希望停止for。
另外,如果要在循环中获取其值,请不要将参数数组更改为其长度。
var array1 = [46,73,-18,0,-442,779,5,1400];
var arrayAverage = function(arrayavg) {
for (var average = 0,answer=0, len = arrayavg.length;len > answer;answer++)
average +=parseInt(arrayavg[answer]);
var calc = average/len;
return calc
};
并称之为:
arrayAverage(array1);
答案 5 :(得分:0)
我认为其他答案(特别是RobG)已经涵盖了大部分内容。为你的循环遵循一些标准规则(我使用)可能会有所帮助:
1)始终将索引作为第一个声明的元素,数组的长度(用于缓存目的)作为第二个,任何其他< / em>后面的变量。
2)始终使用括号将循环代码与函数其余部分中的代码分开。这样您就知道何时返回平均产品(即}
之后)。
所以这是我稍微重写的问题代码:
for (var index = 0, len = arrayavg.length, avg = 0; index < len; index++) {
avg += parseInt(arrayavg[index], 10) / len;
}
return avg;
另请注意,parseInt
应包含基数(在本例中为10)。您可以将其删除,但始终将其包含在内是一种很好的做法。
顺便说一下,您可以使用reduce
使用功能方法找到有用功能的替代方法:
var arrayAverage = function (arr) {
return arr.reduce(function (a, b) { return a + b; }) / arr.length;
}