2012-10-16 10 views
9

mam ten obiekt w JS:jQuery każdy zawsze sortować?

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

biegnę go:

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

Wyjście powinno być:

134 - A 
140 - B 
131 - C 

ale nie wiem dlaczego, wyjście jest :

131 - C 
134 - A 
140 - B 

Każdy pomysł, jak mogę to naprawić?

Odpowiedz

7

Po pierwsze: to nie jest lista, jest to obiekt. Porządek obiektu nie jest zagwarantowany - każda realizacja może wybrać inną kolejność.

Z drugiej strony, tablice nie zachować porządek:

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


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

Więc jak wyłączyć rodzaju? – fdrv

4

Właściwości obiektu nie mają zdefiniowanego porządku, zgodnie ze specyfikacją.

Mechanizm i kolejność wyliczania właściwości (...) nie jest określony.

Source.

Dlatego implementacje ECMA nie muszą wykonywać iteracji w dowolnej kolejności. W rzeczywistości kolejność jest zmienna in different browsers/versions.

3

Dzieje się tak, ponieważ elementy obiektu JavaScript nie mają porządku.

W celu przymocowania go można użyć dwóch tablic: jeden z klawiszy, a po drugie z wartości:

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

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

mogę przesunąć na swoje pytanie, a zajęło mi 10 minut, aby zrozumieć.

To w jaki sposób rozwiązać problem:

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/