使用jQuery .each迭代关联数组

时间:2011-10-06 08:15:21

标签: 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
});

绝对没有任何记录。当我通过替换

将关联数组更改为正常数字索引1
cells[td.attr("id")] = td;

cells.push(td);

它工作正常。

此外,当我尝试使用for..in循环进行迭代时,它按预期工作。

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

Doeas意味着jQuery的.each方法不接受关联数组或者我做错了什么?

3 个答案:

答案 0 :(得分:28)

JavaScript没有关联数组。它有Arrays,它有Objects,而数组恰好是对象。当你这样做时:

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

..你实际上是在做相同的事情:

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

也就是说,您实际上是将属性名为foo添加到对象 a不是元素添加到数组 a

来自jQuery.each()的文档:

  

具有length属性的数组和类似数组的对象(例如函数的arguments对象)通过数字索引进行迭代,从0length-1。其他对象通过其命名属性进行迭代。

由于您创建了Array[])jQuery查看其length属性,并且因为您尚未向该数组添加任何元素(仅属性在对象上,记住)它的length仍为零,所以jQuery(正确)什么都不做。

正如其他人所指出的那样,您要做的是使用例如创建对象来创建对象。 var cells = {};。由于非Array对象没有length属性(不管怎么说,默认情况下),jQuery会知道你真的想要迭代它的属性而不是数组中的数字索引。< / p>

答案 1 :(得分:9)

您似乎认为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.
});

答案 2 :(得分:6)

使用$.each(cells, function(i) { ... })代替$(cells).each(function...)

$.each()功能与$(selector).each功能不同。