【问题标题】:Iterating over jQuery $(this).attr('class').split(" ") gives odd results遍历 jQuery $(this).attr('class').split(" ") 给出奇怪的结果
【发布时间】:2011-03-12 00:07:57
【问题描述】:

我有一个页面,我正在尝试为许多共享一个公共类的 div 获取类数组。例如:

<div class="common lorem ipsum"></div>
<div class="common dolor sit"></div>
<div class="common hello world"></div>

我想获取每个 common 类 div 并获取它的类的数组。目前,我正在使用这个 jQuery 来做这件事:

$('.common').each(function(index) {
  var classes = $(this).attr('class').split(" ");
  for(var i in classes) {
    alert(classes[i]);
  }
});

查看第一个生成的 classes 变量可以得出:

classes: Array (3)
0: "common"
1: "lorem"
2: "ipsum"
length: 3
__proto__: Array

问题是for(var i in classes) 似乎在迭代__proto__ 数组并深入研究它——以前有没有人遇到过这种情况?我使用的是最新版本的 Chrome (6.0.453.1)。

【问题讨论】:

    标签: javascript jquery css arrays iteration


    【解决方案1】:

    要添加到其他有效答案,因为您已经在使用 jQuery,您可以利用jQuery.each

    $.each(classes, function (i, cls) {
        alert(cls);
    });
    

    【讨论】:

      【解决方案2】:

      添加到 meder 的答案...

      有一种方法可以安全地迭代对象,而不会被对象的继承属性所困扰。 hasOwnProperty() 救援:

      for(var i in classes) {
        if (classes.hasOwnProperty(i)) {
          var safeValue = classes[i];
        }
      }
      

      【讨论】:

        【解决方案3】:

        我见过这个用过here

        我不确定 (i in this)0-n 的双重检查会消除什么。

        var thisp = arguments[1];
        for (var i = 0, len = this.length; i < len; i++){
          if (i in this){
            fun.call(thisp, this[i], i, this); // fun(element,index,array)
          }
        }
        

        【讨论】:

        【解决方案4】:

        @meder 对你的问题的回答恰到好处,我只是想补充一点,如果枚举的顺序不重要,你可以随时使用这种简化形式:

        for ( var i = classes.length; i--; ) {
          alert( classes[i] );
        }
        

        它更短,更快。

        【讨论】:

        • 或者如果你想更快,使用负的while循环。
        • 这是多行代码,几乎没有任何好处。这里真正的问题是可读性。这种形式在各个领域都表现出色。
        【解决方案5】:
        for ( var i = 0, l = classes.length; i<l; ++i ) {
         alert( classes[i] );
        }
        

        使用常规 for 循环遍历数组,而不是 for...in,否则它会枚举数组的属性(因为它仍然是一个对象,并且除了内部元素之外还有其他属性)。

        【讨论】:

        • 另请注意,for..in 不能保证按数字顺序访问索引(请参阅MDC
        • 是的,幸好这不是问题
        • ecmascript 5 也将原生支持Array.forEach()
        • 谢谢 meder,这正是我想要的。现在我知道了!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-20
        • 2019-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多