【问题标题】:Iterating an associative array with jQuery .each使用 jQuery .each 迭代关联数组
【发布时间】:2011-12-02 01:43:36
【问题描述】:

可能导致这个问题的最大因素是我现在非常困。

我有一个数组,我启动它:

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

它工作正常。

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

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

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

【问题讨论】:

    标签: javascript jquery loops


    【解决方案1】:

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

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

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

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

    也就是说,您实际上是在向 object a 添加一个名为 foo属性不是添加一个 element 到 array a.

    来自jQuery.each() 的文档:

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

    既然你创建了一个Array ([]) jQuery 会查看它的length 属性,并且由于你没有向数组中添加任何元素(只有对象上的 属性,请记住) 它的length 仍然为零,因此 jQuery(正确地)什么也不做。

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

    【讨论】:

    • 所有我需要知道的,我想我错过了一些课程:)。
    • 很高兴我能帮上忙。这有点令人困惑,只是因为方括号语法对 Array 对象做了两件完全不同的事情!
    • 您在上面链接的 jQuery.each() 函数与他的示例中 OP 使用的函数不同。他使用$(cells).each(...),它旨在用于 DOM 元素的 jquery 集,而不是用于通用“集合”(对象/数组)。我并不是说它不会按原样工作,但真正完整的答案会指出区别 - 或者至少链接到与 OP 正在使用的功能相匹配的文档。 (除此之外,很好的答案)。
    【解决方案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.
    });
    

    【讨论】:

    • 不要学究气,但 JavaScript 没有称为“哈希”的数据类型。它有对象,恰好有一个object literal 语法,看起来很像其他语言中的哈希。 var cells = {}; 只是创建一个没有属性的对象(除了那些从 Object.prototype 继承的对象)。
    • @Jordan,你是绝对正确的,出于某种原因,我认为在我们的上下文中“哈希”比“对象”更容易理解。我更新了我的答案以使用这两个术语。
    • 感谢您的回答,我接受了 Jordan,因为他解释了我的错误假设如何影响 .each 方法。
    • @Przemek,没问题,你做得很好,他的回答很好:)
    【解决方案3】:

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

    $.each() 函数与$(selector).each 函数不同。

    【讨论】:

      猜你喜欢
      • 2015-09-09
      • 2011-09-12
      • 2010-12-14
      • 2012-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-13
      相关资源
      最近更新 更多