Firebug在数组中显示许多未定义的条目

时间:2011-08-09 00:00:48

标签: javascript jquery arrays firebug

我正致力于自定义<select>。但是我遇到了问题。快速console.log(options);显示数组的结果:

  

[undefined,undefined,“Selena Gomez”,“Mila Kunis”,undefined,undefined,undefined,undefined,undefined,undefined,undefined,“Miley Cyrus”]

同样,当我alert(options.length);时,结果为12.实际上,选择中有4个选项..

生成数组的代码:

var options = new Array;               
$(this).children('option').each(function () {
    if ($(this).val()) {
        options[$(this).val()] = $(this).text();
    }
});
console.log(options);

我不知道是什么问题..我添加了if ($(this).val()),确保没有静态进入数组,但仍然。

注意:但是,当我在firebug中打开数组时,它只会显示正确的条目。

4 个答案:

答案 0 :(得分:4)

$(this).val()一定不能是0,1,2,3,而是2,3,11(第四个是哪里?)

改为使用options.push($(this).text());或将其用作对象,以避免自动生成缺失的索引。

另外,如果$(this).val()为空false""0会评估为{{1}},是第四个吗?

答案 1 :(得分:2)

我猜测$(this).val()'Selena Gomez'的$(this).text()是2号而'Miley Cyrus'是11。请尝试这样做:

options.push($(this).text()); // ensure that your array is filled as an array 

例如,这在javascript中是可以的

var a = [];
a[4] = 'test';
a["something"] = this;

和console.log将显示

[undefined, undefined, undefined, undefined, 'test']

答案 2 :(得分:1)

试试这个。

var options = [];               
$(this).children('option').each(function () {
    if ($(this).val()) {
        options.push($(this).text());
    }
});
console.log(options.join(","));

如果你想要文本键,那么使用javascript对象作为关联数组。

var options = {};               
$(this).children('option').each(function () {
    if ($(this).val()) {
        options[$(this).val()] = $(this).text();
    }
});
$.each(options, function(key, value) { 
    console.log(key + ': ' + value); 
});

答案 3 :(得分:1)

这里有一些误导性的回应:

  1. Javascript数组索引是字符串。数组只是具有特殊长度属性的对象和一些方便的方法,但除此之外它们只是对象。他们的属性是字符串。数字属性将被视为索引,并用于设置长度属性。

  2. 没有“缺失钥匙”。如果创建稀疏数组,其长度将设置为最高索引+ 1.如果迭代所有索引从0到长度-1,那么任何不存在的索引将返回 undefined < / p>

  3. e.g。

    var a = [];
    a[0] = 'zero';
    a[4] = 'four';
    console.log(a.length); // 5
    console.log(a); // ["zero", undefined, undefined, undefined, "four"]
    console.log(a[1]);     // undefined
    console.log(a.hasOwnProperty(1)); // false
    

    仅仅因为Firebug列出了包含1到3的idex,因为 undefined 并不意味着它们存在。

    OP的简单循环版本是:

    var opts = this.options;
    for (var i=0, iLen=opts.length; i<iLen; i++) {
      if (opts[i].value) {
        options[opts[i].value] = opts[i].text;
      }
    }