2012-12-07 19 views
5

Ho una chiamata ajax che restituisce un oggetto JSON che è piuttosto complesso e sto avendo difficoltà a farlo.Come si ordina un oggetto JSON per un valore nidificato?

Il mio invito:

$.post('/reports-ajax',arguments, function(data) {} 

La risposta:

{ 
"10001":{ 
    "unitname":"Fort Worth", 
    "discounts":{"12-02-2012":"34.810000","12-03-2012":"20.810000","12-04-2012":"27.040000"}, 
    "gross":{"12-02-2012":"56.730000","12-03-2012":"19.350000","12-04-2012":"66.390000"}, 
    "net":{"12-02-2012":"61.920000","12-03-2012":"98.540000","12-04-2012":"39.350000"}, 
    "discounts_total":82.66, 
    "gross_total":82.47, 
    "net_total":99.81, 
    "number":10001 
    }, 
"10002":{ 
    "unitname":"Dallast", 
    "discounts":{"12-02-2012":"12.600000","12-03-2012":"25.780000","12-04-2012":"47.780000","12-05-2012":"45.210000"}, 
    "gross":{"12-02-2012":"29.370000","12-03-2012":"91.110000","12-04-2012":"60.890000","12-05-2012":"51.870000"}, 
    "net":{"12-02-2012":"16.770000","12-03-2012":"65.330000","12-04-2012":"13.110000","12-05-2012":"06.660000"}, 
    "discounts_total":131.37, 
    "gross_total":33.24, 
    "net_total":101.87, 
    "number":10002 
    }, 
"32402":{ 
    "unitname":"Austin", 
    "discounts":{"12-05-2012":"52.890000","12-02-2012":"22.430000","12-03-2012":"58.420000","12-04-2012":"53.130000"}, 
    "gross":{"12-05-2012":"25.020000","12-02-2012":"2836.010000","12-03-2012":"54.740000","12-04-2012":"45.330000"}, 
    "net":{"12-04-2012":"92.200000","12-05-2012":"72.130000","12-02-2012":"13.580000","12-03-2012":"96.320000"}, 
    "discounts_total":186.87, 
    "gross_total":161.1, 
    "net_total":174.23, 
    "number":32402 
    } 
} 

vado sopra la funzione con uno standard di ogni chiamata e fare un po 'di roba impressionante con Highcharts ma ora sto cercando di risolvere il risposte dalla chiamata net_total e non riesco a capirlo.

Ho provato .sort() e si sbaglia che non è una funzione. Ho letto per un po 'ma credo di non trovare i risultati giusti. Questo sembrava promettente: Sorting an array of JavaScript objects ma non è riuscito con il .sort non è una funzione. Sembra che la maggior parte degli .sort siano su [] array non su oggetti completi.

Qualsiasi aiuto sarebbe molto apprezzato.

+1

Questo non è un array, è un oggetto. Ha proprietà denominate 10001, 10002 e 32402 che di per sé non sono ordinabili. – GolezTrol

+0

possibile duplicato di [Ordinamento di un oggetto JavaScript] (http://stackoverflow.com/questions/1359761/sorting-a-javascript-object) – Bergi

risposta

11

L'ordinamento degli oggetti non ha senso poiché le chiavi degli oggetti non hanno valore di posizione. Ad esempio, questo:

{ a:1, b:2 } 

e questo:

{ b:2, a:1 } 

sono esattamente lo stesso oggetto. Non sono solo simili, sono uguali.

Nulla in javascript di per sé fornisce ai tasti degli oggetti alcun valore posizionale. Alcune persone si sbagliano nella convinzione che:

for (var key in obj) { 

itera attraverso le chiavi dell'oggetto in una sequenza specifica. Ma questo è sbagliato. Si dovrebbe sempre presumere che il ciclo for .. in elabori le chiavi dell'oggetto in ordine casuale, sempre, sempre.

Ovviamente, se si sta per scrivere un browser Web, non si intende implementare un generatore di numeri casuali per analizzare un ciclo for .. in.Pertanto, la maggior parte dei browser Web ha una stabilità accidentale per il modo in cui il ciclo for .. in elabora le chiavi dell'oggetto.

Gli sviluppatori che imparano javascript giocando con il browser possono capire che il loro browser esegue iterazioni attraverso oggetti in ordine alfabetico, ad esempio, o l'ordine in cui le chiavi sono state aggiunte all'oggetto. Ma questo è totalmente casuale e non può essere fatto valere. Il fornitore del browser potrebbe cambiare questo comportamento in futuro senza violare alcuna compatibilità con le versioni precedenti (tranne che con script buggy scritti da persone che ritengono che gli oggetti abbiano un ordinamento). Per non parlare del fatto che diversi browser hanno diverse implementazioni di javascript e quindi non hanno necessariamente lo stesso ordinamento di oggetti all'interno delle chiavi.

Tutto questo è oltre il punto. "Ordine di ordinamento chiave" non ha alcun senso in javascript e qualsiasi comportamento osservato è semplicemente un dettaglio di implementazione. In breve, l'oggetto javascript non ha l'ordine delle chiavi, basti pensare che è casuale.


Soluzione

Ora, cosa si sta veramente cercando di fare è non sorta l'oggetto (non è possibile, ma non ha senso). Quello che stai davvero cercando di fare è elaborare gli attributi dell'oggetto in un ordine specifico. La soluzione è semplicemente creare un array (che ha ordinamento) delle chiavi oggetto e quindi elaborare l'oggetto utilizzando tale array:

// First create the array of keys/net_total so that we can sort it: 
var sort_array = []; 
for (var key in Response) { 
    sort_array.push({key:key,net_total:Response[key].net_total}); 
} 

// Now sort it: 
sort_array.sort(function(x,y){return x.net_total - y.net_total}); 

// Now process that object with it: 
for (var i=0;i<sort_array.length;i++) { 
    var item = Response[sort_array[i].key]; 

    // now do stuff with each item 
} 
+0

Mi piace la risposta di T.J, ma questo mantiene la chiave che è importante. –

5

Quello che hai non è un array e non ha ordine, quindi dovrai trasformarlo in un array in modo da poterlo dare.

Vagamente:

var array = []; 
$.each(data, function(key, value) { 
    array.push(value); 
}); 
array.sort(function(a, b) { 
    return a.net_total - b.net_total; 
}); 

Live Example | Source

Come GolezTroi sottolinea nei commenti, normalmente sopra perderebbe la chiave che ogni voce è memorizzata sotto in data e quindi faresti aggiungerlo nuovamente nel primo $.each ciclo precedente, ma in questo caso le voci già avere la chiave su di loro (come number), quindi non ce n'è bisogno.

Oppure si può sostituire il primo $.each con $.map:

var array = $.map(data, function(entry) { 
    return entry; 
}); 
// ...and then sort etc. 

... se si preferisce.

+1

Perderai le chiavi con questo metodo ma il suo valore è ancora disponibile nella proprietà ' numero 'di ogni oggetto nell'array. – GolezTrol

+0

@GolezTrol: Grazie, aggiungerò quella nota. –

Problemi correlati