2
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'.
}

我想要属性的整数索引 - 这是否可能不使用独立的计数变量?

4

2 回答 2

6

你可以这样做:

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,所以 IE8 需要 es5-shim。

于 2013-02-11T00:58:11.487 回答
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); });
于 2013-02-11T00:57:00.907 回答