2015-08-07 11 views
5

Avere il seguente file (customers.json):di jQuery non mantenere l'ordine originale

{"3":"Andy", "1":"Bruce", "4":"Charlie", "2":"David"} 

utilizzando questo codice:

jQuery.getJSON("/Customers.json", function (data) { 
    console.log(data); 
}); 

Ciò produrrà il seguente:

{"1":"Bruce", "2":"David", "3":"Andy", "4":"Charlie"} 

My Json è intenzionalmente in ordine alfabetico dal nome, ma questo codice sembra mettere in ordine numerico. È una caratteristica? E come faccio a impedire che ciò accada?

Che si fa la differenza, io sto usando Firefox 39.0

EDIT:

La vera questione è, c'è comunque di fare questo, mantenendo tutti i dati, e mantenere l'ordine in che viene ricevuto?

+5

Secondo le specifiche l'ordine dei tasti può essere casuale ..... quindi non si può dipendere da questo ... se l'ordine è importante utilizzare un array –

+0

quale "specifica"? è necessario specificare le specifiche di cui si sta parlando. –

+0

Ogni risposta a questa domanda è stata appena ridimensionata. Stai facendo downvoting di tutte le risposte che non risolvono il tuo Edit o qualcun altro lo sta facendo? – Ghazgkull

risposta

2

Che cosa il vostro JSON dovrebbe essere simile è

[{"id":"3", "name":"Andy"}, {"id":"1", "name":"Bruce"}, {"id":"4", "name":"Charlie"}, {"id":"2", "name":"David"}] 

cosa si sta inviando è una serie di oggetti (clienti), quindi la tua struttura dati dovrebbe riflettere idealmente questo.E trasferendolo come una matrice è possibile mantenere l'ordine, come è già stato menzionato.

+0

Questa è la soluzione! Non sono sicuro del motivo per cui sei stato downvoted. Sembra che vandalismo, ogni risposta ha un downvote! – gunwin

+2

Wow, qualcuno ha appena postato una nuova risposta che ha anche downvoted. Immagino che qualcuno abbia una brutta giornata ... – Jan

0

Se vi preoccupate per l'ordine, è necessario presentare una lista nella risposta JSON

["Andy", "Bruce", "Charlie","David"] 

E poi:

$.each(data,function(i,v){ 
     console.log(v) 
     // or 
     console.log(data[i]) 
}) 
+0

Ma ho perso metà dei miei dati con questa soluzione. – gunwin

+0

Oops, mi mancava. Il metodo corretto è la risposta JAN, sarebbe da "dati [i] .id" o "dati [i] .name" – Blaztix

0

Quando la stringa che viene sopra il filo viene convertito in un Javascript oggetto (l'oggetto che rappresenta i dati JSON), ciò che si ottiene è un oggetto come qualsiasi altro con proprietà e valori. Non esiste un ordinamento di proprietà in un oggetto.

L'oggetto creato dalla JSON:

{"3":"Andy", "1":"Bruce", "4":"Charlie", "2":"David"} 

è identico a un oggetto creato con questo JavaScript:

obj = {}; // <-- Not an array! 
obj[1] = 'Andy'; 
obj[2] = 'Bruce'; 
obj[3] = 'Charlie'; 
obj[4] = 'David'; 

Se si desidera attivare l'oggetto in ordine di proprietà valori , è necessario prima caricare i valori in una matrice e quindi ordinare l'array alfabeticamente.

Qualcosa di simile:

var sorted = []; 
for (var prop in data) { 
    if (data.hasOwnProperty(prop)) { 
     sorted(json[prop]); 
    } 
} 
sorted.sort(); 
console.log(sorted); 
+0

"Modifica" alla domanda originale cambia radicalmente la richiesta. Tuttavia, dovresti essere in grado di risolvere facilmente il tuo problema con la consapevolezza che il tuo JSON originale ti fornisce un oggetto, non un array. – Ghazgkull

0

Esiste un modo per fare questo, mantenendo tutti i dati, e il mantenimento della ordine

Prova utilizzando $.map(), Array.prototype.sort() per restituire array di valori, proprietà dell'oggetto restituito

var json = { 
 
    "3": "Andy", 
 
    "1": "Bruce", 
 
    "4": "Charlie", 
 
    "2": "David" 
 
}; 
 
var res = $.map(json, function(val, key) { 
 
    // keep all data, maintain order 
 
    // return array having value as string with comma "," 
 
    // as separator between `val` from object `key` from object 
 
    // `val`: `Andy` , `key`: `3` 
 
    return [ val + ", " + key ] 
 
}).sort(); 
 
console.log(res); 
 
document.body.textContent = res;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

+0

"downvote" descrizione? – guest271314

+0

Qualcuno ha downvoted tutte le nostre risposte (sembra che ho appena ottenuto un upvote da qualcuno, quindi torna a 0). Qualche troll casuale o l'OP? – Ghazgkull

+0

Nessun downvotes da parte mia (OP) – gunwin

0

Questa è una funzionalità?

Sì tipo di, l'ordine delle proprietà dell'oggetto può essere fino a un'implementazione. Alcuni browser mantengono l'ordine, altri no. Questo è ciò ES5 Specification says:

La meccanica e l'ordine di elencare le proprietà (passo 6.a nel primo algoritmo, passo 7.a nel secondo) non è specificato.

Quindi, non appena si ottiene un oggetto JavaScript da JSON letterale, l'ordine delle proprietà può essere perso.

E come posso evitare che ciò accada?

Esiste un modo per farlo, mantenendo TUTTI i dati e mantenendo l'ordine in cui è stato ricevuto?

L'unico vero modo per risolvere il problema è specificare l'ordine degli oggetti in modo esplicito.

Problemi correlati