使用jQuery .each迭代关联数组
可能这个问题最重要的因素是我现在非常困倦。
我有一个数组,我发起:
var cells = [];
然后我在其中放入一些值(jQuery对象),例如:
$("td").each(function () { var td = $(this); cells[td.attr("id")] = td; });
而现在我的问题。 这段代码:
$(cells).each(function (i) { console.log(this) // firebug console });
绝对没有任何记录。 当我将关联数组更改为正常时,通过替换将数字索引改为1
cells[td.attr("id")] = td;
同
cells.push(td);
它工作正常。
此外,当我尝试使用for..in循环迭代时,它按预期工作。
for (var cell in cells) { console.log(cells[cell]); }
Doeas意味着jQuery的.each方法不接受关联数组或者我做错了什么?
JavaScript没有关联数组。 它有Arrays,它有Objects,而数组恰好是对象。 当你这样做:
var a = []; a['foo'] = 'bar';
..你实际上做的相当于:
var a = []; a.foo = 'bar'; // ^--- property of object 'a'
也就是说,您实际上是在对象 a
添加了一个名为foo
的属性 , 而不是向数组中添加元素 a
。
从jQuery.each()
的文档:
具有
length
属性的数组和类数组对象(例如函数的arguments
对象)由数字索引迭代,从0
到length-1
。 其他对象通过其命名属性进行迭代。
由于你创建了一个Array
( []
),jQuery会查看它的length
属性,因为你还没有向数组中添加任何元素(只有对象上的属性,请记住),它的length
仍为零,因此jQuery(正确)不执行任何操作。
正如其他人所指出的,你要做的是使用例如var cells = {};
创建一个Object var cells = {};
。 由于非Array对象没有length
属性(不管怎么说,默认情况下),jQuery会知道你真的想要迭代它的属性而不是数组中的数字索引。
您似乎认为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. });
使用$.each(cells, function(i) { ... })
而不是$(cells).each(function...)
$.each()
函数与$(selector).each
函数不同。