【问题标题】:How does jQuery.each() work with associative arrays (objects)?jQuery.each() 如何处理关联数组(对象)?
【发布时间】:2011-09-10 16:44:24
【问题描述】:

我有一个关联数组,里面有两个对象。通过$(myassoc).each() 运行它,回调只运行一次。回调参数(索引和对象)也分别返回 0 和整个关联数组。

人们会期望 jQuery.each() 为数组中的每个元素运行,返回正确的键作为索引,返回正确的元素作为对象。

为什么没有发生,jQuery 可以做我所追求的吗?

【问题讨论】:

  • 你能显示代码吗? $(obj).each() 适用于
  • 你试过$.each(myassoc, func...吗?
  • 如果内部只有两个对象(数组的 2 个键),那么只有两次迭代。如果你想each这两个对象你必须再次为他们做.each
  • JavaScript HAS NO 关联数组
  • 据我所知,@Raynos 关联数组只是键/值映射的另一个词。我确实在标题中指定了“对象”。

标签: javascript jquery associative-array


【解决方案1】:

我认为您正在寻找 jQuery.each() 而不是 .each()

试试这个:

    $.each(myassoc, function(index, value){
      //your code
    });

【讨论】:

    【解决方案2】:

    试试这个:

    $.each(assocarray,function(i, value){
      console.log('index: ' + i + ',value: ' + value);
    });
    

    【讨论】:

      【解决方案3】:

      很糟糕。

      不要$(associative_array).each(function () {...})——那是nonsense

      不要$.each(associative_array, function() {...}); -- 有一个不起眼的bug(1)

      要查看错误,请在 javascript 控制台中尝试:

      > $.each({foo:1, length:-1, bar:2}, console.log)
        foo 1
        length -1
        bar 2
      > $.each({foo:1, length:0, bar:2}, console.log)
      

      第一个示例输出三行键值对,这是它应该的。第二个什么都不输出!

      故事的寓意,不要在对象上使用 jQuery.each()。 (JavaScript 中的对象是 essentiallysame thing 作为关联数组。)事情可能永远正常工作,但你冒着有一天对象碰巧有一个名为 length 的成员的风险,它的值恰好是 @987654333 @ 然后你有一个不知从何而来的错误,很难解释。 (我会让你猜测,这个答案的分量很重,这是否发生在我身上。)

      bug report中提到的:

      如果您需要遍历具有长度属性的对象的所有键,jQuery.each 不是正确的解决方案。

      我建议更进一步,永远不要依赖 jQuery.each 来处理关联数组。

      (1) 这个“错误”可能永远无法修复,因为 $.each() 历史上在数组上使用Duck Typing:“具有长度属性的数组和类似数组的对象(例如函数的参数对象) ) 由数字索引迭代。"


      这就是我使用[thanks Dominik]循环遍历对象的属性名称和值,或者换句话说,关联数组的键和值:

      function looper(object, callback) {
          for (var key in object) {
              if (object.hasOwnProperty(key)) {
                  if (false === callback.call(object[key], key, object[key])) {
                      break;
                  }
              }
          }
          return object;
      }
      

      looper() 是 $.each() 的替代品

      > looper({foo:1, length:0, bar:2}, console.log)
        foo 1
        length 0
        bar 2
      

      Just like $.each():

      • 在回调内部,this 是每个值
      • 在回调内部,返回 false(不仅仅是 falsy)终止循环
      • looper() 返回最初传递给它的对象
      • looper() 适用于数组和对象。

      用途:

      var a = [];
      looper({foo:1, length:0, bar:2}, function(k, v) { 
          a.push(k+"="+v); 
      });
      console.assert("foo=1,length=0,bar=2" === a.join());
      

      用 $.each() 试试,你会得到一个空的结果。因为它将这个特定对象解释为一个长度为零的类数组对象。

      【讨论】:

        【解决方案4】:

        问题在于$.each() 函数在内部检索并使用传递集合的length 属性。但在一个没有整数索引的关联数组length 似乎总是0。对于$.each(),现在似乎没有什么可走的了。

        $.each() 函数在内部检索并使用 length 传递集合的属性。

        解决方案就是使用一个对象来代替。

        var obj = {
          "flammable": "inflammable",
          "duh": "no duh"
        };
        $.each( obj, function( key, value ) {
          alert( key + ": " + value );
        });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-06-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多