Итерация ассоциативного массива с помощью jQuery .each - PullRequest
15 голосов
/ 06 октября 2011

Вероятно, самым важным фактором для этого вопроса является то, что я сейчас очень сонный.

У меня есть массив, который я инициирую:

var cells = [];

Затем я помещаю в него некоторые значения (объекты jQuery), например:

$("td").each(function () {
  var td = $(this);
  cells[td.attr("id")] = td;
});

А теперь моя проблема. Этот код:

$(cells).each(function (i) {
  console.log(this) // firebug console
});

абсолютно ничего не записывает. Когда я изменил ассоциативный массив на нормальный, номер индекса один, подставив

cells[td.attr("id")] = td;

с

cells.push(td);

Работало правильно.

Кроме того, когда я пытаюсь перебрать цикл for..in, он работает как положено.

for (var cell in cells) {
  console.log(cells[cell]);
}

Doeas, которые означают, что метод .each в jQuery не принимает ассоциативные массивы или я что-то не так делаю?

Ответы [ 3 ]

28 голосов
/ 06 октября 2011

JavaScript не имеет ассоциативных массивов. У него есть массивы, и у него есть объекты, а массивы оказываются объектами. Когда вы делаете это:

var a = [];
a['foo'] = 'bar';

.. вы на самом деле делаете эквивалент этого:

var a = [];
a.foo = 'bar';
// ^--- property of object 'a'

То есть вы фактически добавляете свойство с именем foo к объекту a, , а не добавляя элемент в массив a.

Из документации на jQuery.each():

Массивы и похожие на массивы объекты со свойством length (например, объект arguments функции) повторяются по числовому индексу от 0 до length-1. Другие объекты повторяются через их именованные свойства.

Поскольку вы создали Array ([]), jQuery просматривает его свойство length и поскольку вы не добавили никаких элементов в массив (помните только свойства для объекта) length по-прежнему равен нулю, поэтому jQuery (правильно) ничего не делает.

Вместо этого, как отметили другие, вы хотите создать объект, используя, например, var cells = {};. Поскольку объект, не являющийся массивом, не имеет свойства length (во всяком случае, не по умолчанию), jQuery будет знать, что вы действительно хотите перебирать его свойства вместо числовых индексов, как в массиве.

9 голосов
/ 06 октября 2011

Вы, кажется, думаете, что массивы Javascript являются ассоциативными, что не так. Вы, вероятно, ищете объекты (или хэши) вместо этого:

var cells = {};         // Not [].
$("td").each(function() {
    var td = $(this);
    cells[td.attr("id")] = td;
});

$.each(cells, function() {
    console.log(this);  // This should work as expected.
});
6 голосов
/ 06 октября 2011

используйте $.each(cells, function(i) { ... }) вместо $(cells).each(function...)

Функция $.each() отличается от функции $(selector).each.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...