【问题标题】:If I Iterate Over an Objects Properties using JQuery $.each() is there an index?如果我使用 JQuery $.each() 遍历对象属性,是否有索引?
【发布时间】:2013-01-26 02:17:34
【问题描述】:
a = {b:'bb',c:'cc',d:'dd'};
$.each(a, function(index){
 // here 'index' is a string variable containing the property name, ie 'b', 'c' or 'd'.
}

我想要属性的 integer 索引 - 如果不使用独立的计数变量,这可能吗?

【问题讨论】:

  • 不,不可能,除非你覆盖每个人的行为。
  • Javascript 中的属性没有内在顺序。你的设计很可能是错误的。
  • 我的设计很好,不过我很佩服你发现隐形编码错误的洞察力。
  • @user1561108 如何计算属性名称?
  • @Šime Vidas 增量?然而,也许这是有缺陷的设计

标签: javascript jquery indexing object-property


【解决方案1】:

不,它是一个对象。当您向 JS 对象添加新属性时,该属性应该在什么位置?如果你在中间删除了一个属性,然后再添加呢?如果合并对象在其源代码中以完全不同的顺序具有相同名称的属性,而将另一个对象合并到原始对象上会怎样?

您可以操纵计数,它可能在很多情况下都有效,但不能保证您会按照您期望的顺序得到东西。当顺序很重要时,您可以使用数组。当它没有并且您想通过名称方便地访问事物时,您使用对象文字。或者,您将数组包装在一个对象中,该对象在通过编写数组排序方法对数组索引进行排序时维护数组索引的映射。

另外,学习 for/in 循环。没有理由使用 jQuery 来迭代非 jQuery 对象。充其量只会稍微慢一点。

编辑:

好吧,如果你想要一个计数而不是一个你可以依赖的索引以供将来参考,那么如果我必须处理 IE8,我只会烘焙我自己的对象类型,因为我们通常尽量不接触 Object 构造函数原型(尽管对于未来规范的规范化,我想如果你可以做到这一点而不破坏通常不会迭代原型方法的数组上使用的 for/in 循环之类的东西,那可能是可以的)。

function IterableCounterObj(objLiteral){ //or perhaps something less painfully named
    this.each = function(iteratorFunc){
        var cnt = 0;
        for(var x in objLiteral){
            cnt++;
            iteratorFunc(x,objLiteral[x],cnt);
        }
    }
}

var a = new IterableCounterObj({b:'bb',c:'cc',d:'dd'});
a.each(function(name,value,count){ console.log(count); });

//too much? Here's the jQuery approach to cruft

var $i = function(objLiteral){
    return new IterableCounterObj(objLiteral);
}

$i({b:'bb',c:'cc',d:'dd'}).each(function(name,value,count){ console.log(count); });

【讨论】:

  • 您要求索引。索引是一种有序键。
  • True :) 就我的目的而言,有些人似乎比提出实际解决方案更感兴趣,它只是用于显示目的,否则毫无意义。我想我把计数和索引放在了错误的位置。过错吧?
  • @user1561108 没什么大不了的。不确定任何解决方案可以通过var cnt = 0;cnt++; 在函数中为您节省多少努力。
  • 我平时是个蟒蛇人,就是伤了我的眼睛。
  • @user1561108 如果您不担心语法和一些设计差异,Python 和 JS 在哲学上有很多共同点。信任用户。尽管我更倾向于将其视为“是的,请多用绳子”。 JS 很容易用于简单的东西而无需学习很多东西,但如果你真正深入了解引擎盖下的内容,它具有许多不错的强大功能。但是,通过适当的一流功能,我们可以包含我们自己的电池,这些电池可以非常快速、轻松地按照我们希望的方式工作。
【解决方案2】:

你可以这样做:

Object.keys( a ).forEach(function ( name, index ) {
    var value = a[name];

    name // the property name
    value // the value of that property
    index // the counter
});

这是 ES5 API,所以你需要 es5-shim 来支持 IE8。

【讨论】:

  • 只要 OP 不假设索引将是一致的待处理对象的更改。
猜你喜欢
  • 2010-12-26
  • 2013-11-01
  • 2019-04-10
  • 2017-12-28
  • 2012-01-08
  • 2017-01-06
相关资源
最近更新 更多