/ / Итерация на асоциативен масив с jQuery .each - javascript, jquery, loops

Итертиране на асоциативен масив с jQuery .each - javascript, jquery, loops

Вероятно най-същественият фактор за този въпрос е, че в момента съм изключително сънлив.

Имам масив, който инициирам:

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

Той работи правилно.

Също така, когато се опитвам да повторим с цикъла за ..in работи както се очаква.

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

Doeas, което означава, че jQuery 's .each методът не приема асоциативни масиви или правя нещо нередно?

Отговори:

28 за отговор № 1

JavaScript няма асоциативни масиви. Тя има масиви и има обекти, а масивите са обекти. Когато направите това:

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

... всъщност правите еквивалент на това:

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

Това означава да добавите a Имот Наречен foo към обект a, не добавяне на елемент към масив a.

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

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

Тъй като сте създали Array ([]) jQuery изглежда length и след като не сте добавили елементи към масива (само Имоти на обекта, запомнете) си length все още е нула и затова jQuery (правилно) не прави нищо.

Това, което искате да направите вместо това, както други отбелязват, е да създадете обект, използвайки напр. var cells = {};, Тъй като не-Array обект няма length свойство (не по подразбиране, все пак) jQuery ще знае, че наистина искате да повторите над него Имоти вместо числови индекси, както в масив.


9 за отговор № 2

Изглежда мислите, че масивите на 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 за отговор № 3

употреба $.each(cells, function(i) { ... }) вместо $(cells).each(function...)

Най- $.each() функцията е различна от $(selector).each функция.