2012-10-16 19 views
9

Ich habe dieses Objekt in JS:jQuery jedes immer sortieren?

var list = {134 : "A",140 : "B",131 : "C"} 

Ich betreibe es mit:

jQuery.each(list, function(key, value) { 
console.log(key + " - " + value); 
}); 

Die Ausgabe sollte:

134 - A 
140 - B 
131 - C 

Aber ich weiß nicht, warum, ist der Ausgang :

131 - C 
134 - A 
140 - B 

Irgendeine Idee, wie kann ich es beheben?

Antwort

7

Zunächst einmal: dass keine Liste, es ist ein Objekt. Die Reihenfolge der Objekte wird nicht garantiert - jede Implementierung kann eine andere Reihenfolge wählen.

Auf der anderen Seite, Arrays konservieren Reihenfolge:

var list = [[134, "A"],[140, "B"],[131, "C"]]; 


jQuery.each(list, function(i, obj) { 
    console.log(i + " - " + obj[0] + " - " + obj[1]); 
}); 
+0

So wie Art zu deaktivieren? – fdrv

4

Die Objekteigenschaften haben keine definierte Reihenfolge gemäß der Spezifikation.

Die Mechanik und Reihenfolge der Aufzählung der Eigenschaften (...) ist nicht spezifiziert.

Source.

Daher müssen ECMA-Implementierungen nicht in beliebiger Reihenfolge durchlaufen werden. In der Tat variiert die Reihenfolge in different browsers/versions.

3

Dies passiert, weil JavaScript-Objektelemente keine Reihenfolge haben.

Um es zu beheben Sie zwei Arrays verwenden kann: eine mit den Tasten, und zweitens mit den Werten:

var keys = [134, 140, 131], 
    values = ["A", "B", "C"]; 

$.each(keys, function(i, key) { 
    console.log(key, values[i]); 
}); 
1

ich in deine Frage stoßen, und es dauerte 10 Minuten zu verstehen.

Dies ist, wie Sie Ihr Problem lösen würde:

var list = {134 : "A",140 : "B",131 : "C"}; 

// 1 - property to list 
list = Object.keys(list).map(
    function(key) { 
     return { num : key , char : list[key]};; 
    }); 

console.debug(list); 
// 2 - sorting the list 
var sorted = list.sort(function(a, b) { 
      if(a.char < b.char) return -1; return 1; 
     }); 

// 3 output 
jQuery.each(sorted, function(index, obj) {  
     console.log(obj.num + " - " + obj.char); 
}); 

JsFiddle: https://jsfiddle.net/wx38rz5L/1578/