Javascript 如果我使用JQuery$.each()迭代对象属性,是否有索引?

Javascript 如果我使用JQuery$.each()迭代对象属性,是否有索引?,javascript,jquery,indexing,object-property,Javascript,Jquery,Indexing,Object Property,我想要属性的整数索引-不使用独立的计数变量就可以吗?不,它是一个对象。当您向JS对象添加新属性时,该属性应该位于什么位置?如果你在中间删除一个属性,然后再添加它呢?如果将另一个对象合并到原始对象上,而合并对象在其源代码中具有完全不同的命名属性,该怎么办 你可以操纵一个计数,它可能在很多情况下都有效,但不能保证你能按预期的顺序完成任务。当顺序很重要时,可以使用数组。如果没有,并且您希望方便地通过名称访问对象,则使用对象文字。或者,将数组包装到一个对象中,该对象通过编写数组排序方法(该方法也对键/名

我想要属性的整数索引-不使用独立的计数变量就可以吗?

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

你可以操纵一个计数,它可能在很多情况下都有效,但不能保证你能按预期的顺序完成任务。当顺序很重要时,可以使用数组。如果没有,并且您希望方便地通过名称访问对象,则使用对象文字。或者,将数组包装到一个对象中,该对象通过编写数组排序方法(该方法也对键/名称映射数组进行排序)来维护数组索引的映射

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

编辑:

如果你想要一个计数,而不是一个索引,你可以依赖它作为将来的参考,那么如果我必须处理IE8,我就只需要烘焙我自己的对象类型,因为我们通常都尽量不接触对象构造函数原型(虽然对于未来规范的规范化,我想如果您可以在不破坏数组上使用的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); });

这是ES5 API,因此IE8需要ES5垫片。

不,除非覆盖每个属性的行为,否则不可能。Javascript中的属性没有内在顺序。您的设计很可能是错误的。我的设计很好,我欣赏您发现不可见编码错误的感知能力。@user1561108如何计算属性名?@Šime Vidas递增?也许这是有缺陷的设计,但前提是OP没有假设索引在对象更改之前是一致的。您要求索引。索引是一种有序键的类型。对我而言,这似乎比提供实际解决方案更感兴趣,这只是为了展示,否则毫无意义。我想我把计数和索引放错位置了。我有罪吗?@user1561108没什么大不了的。不确定任何解决方案可以为您节省多少精力
var cnt=0然后
cnt++在函数中。我通常是一个python人,这会伤害我的眼睛。@user1561108 python和JS在哲学上有很多共同点,如果你不注意语法和一些设计差异的话。信任用户。虽然我倾向于认为它更像是“是的,请多点绳子。”JS很容易用在简单的东西上,而不需要学习很多东西,但是如果你真的深入了解它,它有很多很好的强大功能。然而,只要有适当的一流功能,我们就可以拥有自己的电池,它们能够以我们希望的方式快速、轻松地工作。
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); });
Object.keys( a ).forEach(function ( name, index ) {
    var value = a[name];

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