Firebug отображает множество неопределенных записей в массиве - PullRequest
2 голосов
/ 09 августа 2011

Я работаю над настройкой <select>. Но я застрял за проблемой. Быстрый console.log(options); показывает результат массива:

[не определено, не определено, "Селена Гомес", "Мила Кунис", не определено, не определено, не определено, не определено, не определено, не определено, не определено, "Майли Сайрус"]

Также, когда я делаю 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 ]

4 голосов
/ 09 августа 2011

$(this).val() не должно быть 0, 1, 2, 3, а скорее 2, 3, 11 (где 4-й?)

Используйте options.push($(this).text()); вместо этого или используйте его как объект, чтобы избежать автоматической генерации отсутствующих индексов.

Кроме того, $(this).val() оценивается как false, если оно пустое "" или 0, возможно, это 4-е число?

2 голосов
/ 09 августа 2011

Я предполагаю, что $(this).val() для $(this).text() 'Selena Gomez' - это число 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']
1 голос
/ 09 августа 2011

Здесь есть несколько вводящих в заблуждение ответов:

  1. Индексы массива Javascript являются строками.Массивы - это просто объекты со специальным свойством длины и некоторыми удобными методами, но в остальном это просто объекты.Их свойства являются строками.Числовые свойства будут обрабатываться как индексы и использоваться для установки свойства длины.

  2. Нет «отсутствующих ключей».Если вы создаете разреженный массив, его длина будет установлена ​​на самый высокий индекс + 1. Если вы перебираете все индексы от 0 до длины -1, то любой, который не существует, вернет undefined

например,

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 включительно, как undefined , не означает, что они существуют.

Aверсия простого цикла 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;
  }
}
1 голос
/ 09 августа 2011

Попробуйте это.

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); 
});
...