错误的值被推送到Javascript数组中

时间:2014-02-14 02:18:24

标签: javascript jquery

我有一个包含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);
});

2 个答案:

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