2012-03-30 10 views
2

In IE9 werden die numerischen Schlüssel der Objekteigenschaften sortiert, und das führt zu einer anderen Iterationsreihenfolge in IE9 im Vergleich zu IE8, wo die Reihenfolge beibehalten wird, wie sie eingefügt wird.Reihenfolge der Iteration unterscheidet sich in IE9

var obj = { 
    "5": "John", 
    "1": "Kumar", 
    "3": "Rajesh", 
    "2": "Yogesh" 
} 

for(var key in obj) alert(key) 

Ergebnis

// 1,2,3,4 in IE9

// 5,1,3,2 in IE8, IE7

Gibt es trotzdem kann ich deaktivieren Diese automatische Sortierung nach IE9. Wenn nicht, dann ist es möglich, dem Browser zu verdeutlichen, dass die Schlüssel als Zeichenfolgen statt als Zahl identifiziert werden sollten (ohne Leerzeichen, _ oder andere Sonderzeichen).

Bitte schlagen Sie vor!

Hier ist das Beispiel Code-Snippet, wo ich mit diesem Problem konfrontiert bin.

function Person(id, name) { 
    this.id = id; 
    this.name = name; 
} 

var persons = new Object(); 

var p1 = Person("5","John") 
persons[5]=p1 
var p2 = Person("1","Kumar") 
persons[1]=p2 
var p3 = Person("3","Rajesh") 
persons[3]=p3 
var p4 = Person("4","Yogesh") 
persons[4]=p4 


for(var id in personId){ 
    var p = persons[id]; 
    var option = new Option(p.name, p.id); 
    select.options[select.options.length] = option; 
} 

Die Auswahl dieses Skript generiert Optionen wurde nach der ID in IE9 sortiert, wo ich in der gleichen Reihenfolge müssen, in dem sie eingesetzt ist.

+1

Wie ich es verstehe Objekt Reihenfolge Iteration Reihenfolge ist nicht _garanteed_ von der JS-Spezifikation, also obwohl einige (die meisten?) Browser scheinen die Reihenfolge zu halten, können Sie nicht darauf verlassen. Wenn die Reihenfolge wichtig ist, verwenden Sie ein Array - oder kopieren Sie die Schlüssel in ein Array, sortieren Sie sie nach Bedarf und durchlaufen Sie das Array, um die Schlüssel zu erhalten. – nnnnnn

+0

'var PersonenArray = [p1, p2, p3, p4]; für (var i = 0; i

Antwort

9

Die Reihenfolge der Eigenschaftenauflistung ist in ECMAScript bis einschließlich Version 5 (die aktuelle Version zum Zeitpunkt des Schreibens) nicht definiert und variiert zwischen den Browsern. Daher sollten Sie sich nicht auf eine bestimmte Reihenfolge verlassen. Wenn Sie eine vorhersehbare Reihenfolge benötigen, verwenden Sie ein Array und eine for oder while Schleife. Für Ihr Beispiel würde eine Option sein:

var arr = [ 
    {rank: "5", name: "John"}, 
    {rank: "1", name: "Kumar"}, 
    {rank: "3", name: "Rajesh"}, 
    {rank: "2", name: "Yogesh"} 
]; 

for (var i = 0; i < arr.length; ++i) alert(arr[i].rank); 

Eine letzte Hinweis: Aufzählungsreihenfolge, wenn eine for...in-Schleife ist nicht für jede Art von Objekt garantiert, einschließlich Arrays, so sollten Sie immer for oder while wenn Auftrag Angelegenheiten verwenden .

+1

Um hinzuzufügen, könnten Sie ein Array haben, das die Schlüssel in der Reihenfolge auflistet, in der sie angezeigt werden sollen. –

+0

@Kolink: Einverstanden. Ich habe ein Beispiel hinzugefügt. –

+1

Es lohnt sich, hier klarzustellen, dass selbst für ein Array 'for..in' nicht garantiert ist, dass es in einer bestimmten Reihenfolge vorkommt (zumindest habe ich noch nie etwas in der Spezifikation gefunden, das so aussagt, und IE8 und früher nicht t mache sie in der Reihenfolge); [Testfall] (http://jsbin.com/uwavoz). Einige Implementierungen bringen die Array-Indizes in Ordnung, auch wenn sie nicht mit einem äquivalenten Objekt (Firefox, zum Beispiel gibt 5, 1, 3, 2 dann 1, 2, 3, 5 in meinem verknüpften Testfall), aber nicht alle . Es muss nicht einmal eine spärliche Anordnung sein; [Testfall] (http://jsbin.com/uwavoz/2). Wenn Sie eine Bestellung benötigen, verwenden Sie eine 'for' -Schleife oder eine der neuen ES5-Funktionen. –

Verwandte Themen