2015-08-07 14 views
5

folgende Datei Mit (customers.json):jQuery getJSON Aufrechterhaltung nicht ursprüngliche Reihenfolge

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

diesen Code verwenden:

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

erhalten Sie folgende Ausgabe des folgenden:

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

Mein Json ist absichtlich in alphabetischer Reihenfolge nach dem Namen, aber dieser Code scheint in numerischer Reihenfolge zu stehen. Ist das ein Feature? Und wie verhindere ich das?

Ob es macht einen Unterschied, ich bin mit Firefox 39.0

EDIT:

Die eigentliche Frage hier ist, ist es trotzdem, dies zu tun, um alle Daten zu halten, und die Aufrechterhaltung der Ordnung in was wird empfangen?

+5

Gemäß der Spezifikation kann die Reihenfolge der Schlüssel zufällig sein ..... so können Sie sich nicht darauf verlassen ... Wenn die Reihenfolge wichtig ist, verwenden Sie ein Array –

+0

was "spec"? Sie müssen angeben, über welche Spezifikation Sie sprechen. –

+0

Jede Antwort auf diese Frage wurde gerade abgelehnt. Schränken Sie alle Antworten ab, die Ihren Edit nicht lösen, oder macht jemand anderes das? – Ghazgkull

Antwort

2

Was Ihre Json sollte wie folgt aussehen ist

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

Was Sie senden eine Reihe von Objekten (Kunden), so dass Ihre Datenstruktur ideal widerspiegeln sollte.Und übertragen Sie es als ein Array können Sie die Reihenfolge beibehalten, wie bereits erwähnt wurde.

+0

Das ist die Lösung! Nicht sicher, warum Sie abgelehnt wurden. Scheint wie Vandalismus, jede Antwort hat einen Downvote! – gunwin

+2

Wow, jemand hat gerade eine neue Antwort gepostet, die ebenfalls abgelehnt wurde. Ich nehme an, jemand hat einen schlechten Tag ... – Jan

0

Wenn Sie über die Bestellung kümmern, müssen Sie eine Liste in der Antwort JSON

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

einreichen Und dann:

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

Aber ich habe die Hälfte meiner Daten mit dieser Lösung verloren. – gunwin

+0

Ups, es hat mich vermisst. Die richtige Methode ist die antwortende JAN, würde durch "data [i] .id" oder "data [i] .name" – Blaztix

0

Wenn die Zeichenfolge, die über den Draht kommt, wird auf eine Javascript umgewandelt Objekt (das Objekt, das die JSON-Daten darstellt), was Sie am Ende haben, ist ein Objekt wie jedes andere mit Eigenschaften und Werten. Es gibt keine Reihenfolge von Eigenschaften in einem Objekt.

Das Objekt aus dem JSON erstellt:

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

auf ein Objekt mit diesem Javascript erstellt identisch ist:

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

Wenn Sie das Objekt in der Reihenfolge der Eigenschaft Werte zur Ausgabe , müssen Sie zuerst die Werte in ein Array laden und dann das Array alphabetisch sortieren.

Etwas wie:

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

Die "Edit" zur ursprünglichen Frage ändert die Anfrage grundlegend. Dennoch sollten Sie in der Lage sein, Ihr Problem leicht zu lösen, wenn Sie wissen, dass Ihr ursprünglicher JSON Ihnen ein Objekt und kein Array zur Verfügung stellt. – Ghazgkull

0

da dies trotzdem zu tun ist, um alle Daten zu halten, und die Aufrechterhaltung der Ordnung

Array.prototype.sort() Verwendung $.map(), Versuchen Array von Werten zurückzukehren, Eigenschaften des zurückgegebenen Objekts

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" Beschreibung? – guest271314

+0

Jemand hat alle unsere Antworten abgelehnt (sieht so aus, als hätte ich gerade eine Verbesserung von jemandem bekommen, also zurück zu 0). Entweder ein zufälliger Troll oder das OP? – Ghazgkull

+0

Nein downvotes von mir (OP) – gunwin

0

Ist das ein Feature?

Ja Art, kann die Reihenfolge der Eigenschaften des Objekts bis zu einer Implementierung sein. Einige Browser behalten die Reihenfolge bei, andere nicht. Dies ist, was ES5 Specification says:

Die Mechanik und um die Eigenschaften von Aufzählen (Schritt 6.a in dem ersten Algorithmus, Schritt 7.a in der Sekunde) ist nicht spezifiziert.

Sobald Sie ein JavaScript-Objekt aus JSON-Literal erhalten, kann die Reihenfolge der Eigenschaften verloren gehen.

Und wie verhindere ich das?

Gibt es eine Möglichkeit, dies zu tun, alle Daten zu halten und die Reihenfolge zu erhalten, in der sie empfangen wird?

Die einzige Möglichkeit, das Problem zu lösen, besteht darin, die Reihenfolge der Objekte explizit anzugeben.

Verwandte Themen