Javascript数组没有返回正确的长度

时间:2011-06-15 09:04:49

标签: javascript

这可能是非常愚蠢的事情,但对于我的生活,我看不到它。

我有使用字符串填充数组的代码,然后我想循环遍历数组并将值添加到select控件中作为选项。但由于某些原因,当我调用length属性时,它返回0,但如果我使用console.dir在控制台中显示数组,则其中包含数据。

这是代码:

var sectors = new Array();
// code to add values 
$.getJSON("get/tech_info.php", {uid:json.uid}, function(data){

    $.each(data, function(i, json){
        if($.inArray(json.area, sectors) == -1)
        {
            sectors[sectors.length] = json.area;
        }
    });
});


console.dir(sectors);

var sec = "#mainSectors" + count;
console.log(sectors.length); // returning 0
for ( var i=0; i != sectors.length; i++ ){

    console.log("bla bla bla");
    $(sec).append(
        $("<option></option>").html(sectors[i])
    );
}

以下是您可以看到的cosole.dir数据:

//secotrs
Array[0]
0: "Industrial"
1: "Commercial"
length: 2
__proto__: Array[0]

4 个答案:

答案 0 :(得分:4)

您正在进行Ajax调用。 Ajax 异步!调用后的代码(for循环)在执行回调之前运行(并填充数组)。

将所有依赖于sectors的代码放入回调中:

var sectors = [];

$.getJSON("get/tech_info.php", {uid:json.uid}, function(data){

    $.each(data, function(i, json){
        if($.inArray(json.area, sectors) == -1)
        {
            sectors.push(json.area);
        }
    });

    var sec = "#mainSectors" + count;
    console.log(sectors.length); //
    for ( var i=0; i != sectors.length; i++ ){

        console.log("bla bla bla");
        $(sec).append(
            $("<option></option>").html(sectors[i])
        );
    }

});

<强>更新

关于console.dir的输出:这是我假设的。在控制台中展开条目时,而不是在进行调用时,将获取对象的属性。

示例:

> a = [];
  []
> console.dir(a)
  ▸ Array[0]
    undefined
> a.push(5)
  1

当我现在点击Array[0]旁边的标记时,我得到:

▾ Array[0]
   0: 5
   length: 1
  ▸ __proto__: Array[0]

可以预期,显示0: 5,因为它稍后会添加(console.dir之后)。

答案 1 :(得分:1)

在某些内容添加到数组之前,您正在显示length属性(带console.log,因此我认为0是正确的长度。之后,您正在循环一个空数组。

此外,如果扇区有length,那么for ( var i=0; i != sectors.length; i++ )可以无限运行,因为当它不是sector.length并且继续前进时它会跳过i。使用i<sectors.length

答案 2 :(得分:0)

我认为这一行sectors[sectors.length] = json.area; sector 超出范围var sectors = new Array();应该在任何函数之外的主范围内

答案 3 :(得分:0)

不应该如下:

  if($.inArray(json.area, sectors) == -1)

  if($.inArray(json.area, sectors) != -1)