Вероятно най-същественият фактор за този въпрос е, че в момента съм изключително сънлив.
Имам масив, който инициирам:
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 за отговор № 1JavaScript няма асоциативни масиви. Тя има масиви и има обекти, а масивите са обекти. Когато направите това:
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
функция.