我正致力于自定义<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中打开数组时,它只会显示正确的条目。
答案 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)
这里有一些误导性的回应:
Javascript数组索引是字符串。数组只是具有特殊长度属性的对象和一些方便的方法,但除此之外它们只是对象。他们的属性是字符串。数字属性将被视为索引,并用于设置长度属性。
没有“缺失钥匙”。如果创建稀疏数组,其长度将设置为最高索引+ 1.如果迭代所有索引从0到长度-1,那么任何不存在的索引将返回 undefined < / p>
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;
}
}