2012-10-16 12 views
9

Ho questo oggetto in JS:jQuery ognuno lo ordina sempre?

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

lo eseguo con:

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

L'output dovrebbe essere:

134 - A 
140 - B 
131 - C 

Ma io non so perché, l'uscita è :

131 - C 
134 - A 
140 - B 

Qualche idea come posso risolverlo?

risposta

7

Prima di tutto: che non è un elenco, si tratta di un oggetto. L'ordine dell'oggetto non è garantito per essere mantenuto - ogni implementazione può scegliere un diverso ordine.

D'altra parte, gli array fanno ordine preservare:

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


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

Così come disabilitare sorta? – fdrv

4

Le proprietà dell'oggetto non hanno un ordine definito, come da specifica.

La meccanica e l'ordine di enumerazione delle proprietà (...) non è specificato.

Source.

Pertanto, le implementazioni ECMA non devono essere ripetute in alcun ordine. In realtà, l'ordine varia in different browsers/versions.

3

Ciò si verifica perché gli oggetti oggetto JavaScript non hanno ordine.

Al fine di risolvere il problema è possibile utilizzare due array: una con i tasti, e la seconda con i valori:

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

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

mi imbatto in tua domanda, e mi ci sono voluti 10 minuti per capire.

Questo è come si dovrebbe risolvere il problema:

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/

Problemi correlati