使用jQuery .each迭代关联数组

Prz*_*mek 16 javascript jquery loops

可能这个问题最重要的因素是我现在非常困倦.

我有一个数组,我发起:

var cells = [];
Run Code Online (Sandbox Code Playgroud)

然后我在其中放入一些值(jQuery对象),例如:

$("td").each(function () {
  var td = $(this);
  cells[td.attr("id")] = td;
});
Run Code Online (Sandbox Code Playgroud)

现在我的问题.这段代码:

$(cells).each(function (i) {
  console.log(this) // firebug console
});
Run Code Online (Sandbox Code Playgroud)

绝对没有任何记录.当我通过替换将关联数组更改为正常数字索引1

cells[td.attr("id")] = td;
Run Code Online (Sandbox Code Playgroud)

cells.push(td);
Run Code Online (Sandbox Code Playgroud)

它工作正常.

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

for (var cell in cells) {
  console.log(cells[cell]);
}
Run Code Online (Sandbox Code Playgroud)

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

Jor*_*ing 29

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

var a = [];
a['foo'] = 'bar';
Run Code Online (Sandbox Code Playgroud)

..你实际上做的相当于:

var a = [];
a.foo = 'bar';
// ^--- property of object 'a'
Run Code Online (Sandbox Code Playgroud)

也就是说你实际上添加一个属性foo对象 a,添加元素数组 a.

从以下文档jQuery.each():

阵列和以阵列状物体length属性(如功能的arguments对象)由数字索引重复,从0length-1.其他对象通过其命名属性进行迭代.

既然你创建了一个Array([])的jQuery看它的length属性,因为你还没有添加任何元素的数组(唯一的对象,记住)它length仍然是零,因此jQuery的(正确的)什么都不做.

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

  • 您在上面链接的[jQuery.each()](http://api.jquery.com/jQuery.each/)函数*不是*在他的示例中OP使用的相同函数.他使用[$(cells).each(...)](http://api.jquery.com/each/),它用于jquery-DOM元素集,而不是通用'集合'(对象/阵列).我并不是说它不会按原样运行,但是一个真正完整的答案会指出这种区别 - 或者至少链接到与OP使用的功能相匹配的文档.(除此之外,好的答案). (3认同)

Fré*_*idi 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.
});
Run Code Online (Sandbox Code Playgroud)


Lee*_*Lee 6

$.each(cells, function(i) { ... })而不是$(cells).each(function...)

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