2011-01-14 4 views
3

クロム(IE、FFではなく)のみに興味深い問題があるようです。 クロムは、格納されている順番で "文字列数値"キーを反復することができますか?

var myObj = { 
    "59" : "Hello", 
    "52" : "and", 
    "50" : "how", 
    "31" : "are", 
    "65" : "you" 
}; 

は、次の順序で内容を吐き出すforループを介して、このオブジェクトの上に行く:

for(var j in myObj) { document.write(myObj[j] +', '); } 

are, how, and, hello, you 

他のすべての主要なブラウザは、「適切な」ためにそれを与える、次のオブジェクトを考えます。 Chromeはキーを文字列ではなく整数として扱います。問題は、私が変更できないjsonデータソースがあることです。オブジェクトにある順序でアイテムにアクセスする必要があります。

誰でもGoogle Chromeでこれを行う方法を提案できますか?

+0

Tここには「正しい」注文はありません。 –

答えて

5

for...inでオブジェクトを反復処理する場合、プロパティの順序は保証されません。あなたができることは何もありません:

任意の順序でオブジェクトのプロパティを超えるfor...inループ反復するが、(1が少なくともクロスに、反復の見せかけの秩序に依存することはできません理由の詳細についてはdelete operatorを参照してください - ブラウザ設定)。 ECMAScriptのは、実装依存のオブジェクトの繰り返し順序になりますが、すべての主要なブラウザは、最初くる最古の追加プロパティに基づいて繰り返し順序(時をサポートするように見えるかもしれ

そしてdeleteページから少なくともプロトタイプにないプロパティの場合)。しかし、Internet Explorerの場合、プロパティでdeleteを使用すると、混乱した動作が発生し、他のブラウザが順序付き連想配列としてオブジェクトリテラルのような単純なオブジェクトを使用できなくなります。エクスプローラーでは、プロパティ値が実際には未定義に設定されていますが、後で同じ名前のプロパティーを追加すると、そのプロパティーは元の位置に反復されます。プロパティを削除してから追加しました。

クロスブラウザー環境で順序付き連想配列をシミュレートする場合は、2つの別々の配列(キー用と値用の2つ)を使用するか、プロパティオブジェクトなど

4

あなたはそれがそのようである理由を知りたい場合は、「オブジェクトのプロパティinterationに間違った順序」V8の課題トラッカーでは非常に長い議論を読んで気軽に:

http://code.google.com/p/v8/issues/detail?id=164

+1

+1興味深い:) –

関連する問題