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
});

これはES5APIであるため、IE8にはes5-shimが必要です。

于 2013-02-11T00:58:11.487 に答える
1

いいえ、それはオブジェクトです。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); });
于 2013-02-11T00:57:00.907 に答える