我有一个包含4个对象的JSON字符串,每个对象都包含一个数组tennisballs
,其中this.tennisballs.length
约为2000
。在我的代码中,我认为我应该得到所有网球权重的4个平均值的数组,但显然我得到了2000个长度的数组。那是为什么?
$.each(data, function () {
var average = Array();
var sum = 0;
for (var i = 0; i < this.tennisballs.length; ++i) {
sum += parseFloat(this.tennisballs[i][2]);
if (i == (this.tennisballs.length - 1)) {
average[i] = sum / this.tennisballs.length;
average.push(average[i]);
console.log("sum: " + sum + ", average[" + i + "]" + average[i]);
}
}
console.log("average array:" + average);
});
答案 0 :(得分:2)
在数组的特定索引处分配项目且该索引超出数组长度时,将在该索引之后调整长度。
当您将平均值分配给average[i]
并且i
大约为2000时,它会使数组的长度大约为2000,尽管数组中的大多数项都是未定义的。
要将平均最后一个放在数组中,请不要在索引i
处分配,只需按下它即可。使用average.length-1
获取数组中最后一项的索引。此外,您应该在循环外创建数组,并在循环后显示它:
var average = Array();
$.each(data, function() {
var sum = 0;
for(var i = 0; i < this.tennisballs.length; ++i){
sum += parseFloat(this.tennisballs[i][2]);
if(i == (this.tennisballs.length - 1) ) {
average.push(sum / this.tennisballs.length);
console.log("sum: " + sum + ", average["+(average.length-1)+"]: " + average[average.length-1]);
}
}
});
console.log("average array:" + average);
旁注:您可以在循环后推送avarage,而不是检查循环中每次迭代的索引:
var average = Array();
$.each(data, function() {
var sum = 0;
for(var i = 0; i < this.tennisballs.length; ++i){
sum += parseFloat(this.tennisballs[i][2]);
}
average.push(sum / this.tennisballs.length);
console.log("sum: " + sum + ", average["+(average.length-1)+"]: " + average[average.length-1]);
});
console.log("average array:" + average);
答案 1 :(得分:1)
您正在将项目存储在average
数组的第2000个位置,因此它的长度始终为2000.
E.g:
> a = Array()
[]
> a[2000 - 1] = 2000/10
200
> a.length
2000
除最后一项外,Array
average
中的其余项目为undefined