2011-01-14 6 views
3

Ich habe ein interessantes Problem nur in Chrom (nicht IE, FF). Angesichts das folgende Objekt:Kann chrome gezwungen werden, "String numerische" Tasten in der Reihenfolge, in der sie gespeichert sind, zu wiederholen

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

Going über dieses Objekt über eine for-Schleife spuckt den Inhalt in der folgenden Reihenfolge:

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

are, how, and, hello, you 

die alle anderen großen Browser geben es in ‚richtigen‘ Reihenfolge. Chrome behandelt die Schlüssel als Ganzzahlen anstelle von Zeichenfolgen. Das Problem ist, dass ich eine JSON-Datenquelle habe, die ich nicht ändern kann, und ich muss auf die Elemente in der Reihenfolge zugreifen, in der sie sich im Objekt befinden.

Kann jemand einen Weg vorschlagen, dies in Google Chrome zu tun?

+0

T Hier ist keine "richtige" Reihenfolge. –

Antwort

5

Beim Iterieren über ein Objekt über for...in ist die Reihenfolge der Eigenschaften nicht garantiert. Es gibt nichts, was Sie tun können:

A for...in Schleife iteriert über die Eigenschaften eines Objekts in einer beliebigen Reihenfolge (siehe delete operator für mehr auf, warum man auf die scheinbare Ordnung der Iteration nicht abhängen kann, zumindest in einem Kreuz -Browser-Einstellung).

Und von der delete Seite:

Obwohl ECMAScript Iteration Reihenfolge der Objekte Implementierung abhängig macht, kann es scheinen, dass alle gängigen Browser eine Iterationsreihenfolge ersten Kommen auf dem frühesten zusätzliche Eigenschaft basiert support (at mindestens für Eigenschaften, die nicht auf dem Prototyp sind). Wenn jedoch bei Internet Explorer delete für eine Eigenschaft verwendet wird, führt dies zu verwirrendem Verhalten und verhindert, dass andere Browser einfache Objekte wie Objektliterale als geordnete assoziative Arrays verwenden. Wenn im Explorer der Wert der Eigenschaft tatsächlich auf undefiniert festgelegt ist, wird die Eigenschaft, wenn sie später eine Eigenschaft mit demselben Namen zurückgibt, an der alten Position iteriert - nicht am Ende der Iterationssequenz, wie erwartet löschte die Eigenschaft und fügte sie dann wieder hinzu.

Wenn Sie also ein geordnetes assoziatives Array in einer browserübergreifenden Umgebung simulieren möchten, müssen Sie entweder zwei separate Arrays verwenden (eins für die Schlüssel und das andere für die Werte) oder ein Array aus einzelnen Arrays erstellen. Immobilien Objekte usw.

4

Wenn Sie wissen möchten, warum es so ist, fühlen sich frei, die sehr lange Diskussion im V8 Issue Tracker „Falsche Reihenfolge in Objekteigenschaften interation“ zu lesen:

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

+1

+1 interessant :) –

Verwandte Themen