这可能是非常愚蠢的事情,但对于我的生活,我看不到它。
我有使用字符串填充数组的代码,然后我想循环遍历数组并将值添加到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]
答案 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)