Ich muss JavaScript-Objekte nach Schlüssel sortieren.
Daher folgendes:
{ 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' }
Würde werden:
{ 'a' : 'dsfdsfsdf', 'b' : 'asdsad', 'c' : 'masdas' }
javascript
sorting
vdh_ant
quelle
quelle
Object.entries
undObject.fromEntries
JS hinzugefügt wurden, kann dies mit einem schön kurze Einzeiler erreicht werden:Object.fromEntries(Object.entries(obj).sort())
Antworten:
Die anderen Antworten auf diese Frage sind veraltet, entsprechen nie der Implementierungsrealität und sind nach Veröffentlichung der ES6 / ES2015-Spezifikation offiziell falsch geworden.
Weitere Informationen finden Sie im Abschnitt zur Reihenfolge der Eigenschaftsiteration in Exploring ES6 von Axel Rauschmayer :
Ja, JavaScript-Objekte sind tatsächlich geordnet, und die Reihenfolge ihrer Schlüssel / Eigenschaften kann geändert werden.
So können Sie ein Objekt alphabetisch nach seinen Schlüsseln / Eigenschaften sortieren:
Verwenden Sie
var
stattconst
für die Kompatibilität mit ES5-Motoren.quelle
JavaScript-Objekte 1 sind nicht geordnet. Es ist sinnlos zu versuchen, sie zu "sortieren". Wenn Sie die Eigenschaften eines Objekts durchlaufen möchten, können Sie die Schlüssel sortieren und dann die zugehörigen Werte abrufen:
Alternative Implementierung mit
Object.keys
Phantasie:1 Um nicht pedantisch zu sein, aber es gibt kein JSON-Objekt .
quelle
{"a", 1}
JSON Array ist ein präziser Begriff für eine Zeichenfolge wie[1]
. Es ist nützlich, in der Lage zu sein, zu kommunizieren, indem Sie Dinge wie das dritte Objekt in meinem Array sagen, wenn Sie die Zeichenfolge haben.[{x: 1}, {y: 2}, {z: 3}]
Daher bevorzuge ich "Das ist kein JSON-Objekt", wenn ich ein Javascript-Literal kommentiere, anstatt "Es gibt kein solches." Ding als JSON-Objekt ", was später, wenn das OP tatsächlich mit JSON arbeitet, zu mehr Verwirrung und Kommunikationsschwierigkeiten führen wird.{"a", 1}
ist entweder ein Objektliteral oder ein JSON-Text (auch bekannt als JSON-Zeichenfolge, wenn Sie es wirklich bevorzugen). Was es ist, hängt vom Kontext ab. Ersteres, wenn es wörtlich im JavaScript-Quellcode erscheint, letzteres, wenn es sich um eine Zeichenfolge handelt, die an einen JSON-Parser übergeben werden muss, um weiter verwendet zu werden. Es gibt echte Unterschiede zwischen den beiden, wenn es um zulässige Syntax, korrekte Verwendung und Serialisierung geht.Viele Leute haben erwähnt, dass "Objekte nicht sortiert werden können" , aber danach geben sie Ihnen eine Lösung, die funktioniert. Paradox, nicht wahr?
Niemand erwähnt, warum diese Lösungen funktionieren. Dies ist der Fall, da in den meisten Implementierungen des Browsers Werte in Objekten in der Reihenfolge gespeichert werden, in der sie hinzugefügt wurden. Wenn Sie ein neues Objekt aus einer sortierten Liste von Schlüsseln erstellen, wird daher ein erwartetes Ergebnis zurückgegeben.
Und ich denke, wir könnten noch eine Lösung hinzufügen - ES5-Funktionsweise:
ES2015-Version von oben (formatiert als "Einzeiler"):
Kurze Erklärung der obigen Beispiele (wie in den Kommentaren gefragt):
Object.keys
gibt uns eine Liste der Schlüssel in dem bereitgestellten Objekt (obj
odero
), dann sortieren wir diese mit dem Standardsortieralgorithmus. Als nächstes.reduce
wird dieses Array wieder in ein Objekt konvertiert, diesmal jedoch mit allen Schlüsseln sortiert.quelle
for...in
. B. via ).Object.keys(dict).sort().reduce((r, k) => Object.assign(r, { [k]: dict[k] }), {});
Leute, ich bin im übertragenen Sinne schockiert! Sicher, alle Antworten sind etwas alt, aber niemand hat die Stabilität beim Sortieren erwähnt! Nehmen Sie also mein Bestes, um die Frage selbst zu beantworten und hier auf Details einzugehen. Also werde ich mich jetzt entschuldigen, es wird viel zu lesen sein.
Da es 2018 ist, werde ich nur ES6 verwenden. Die Polyfills sind alle in den MDN-Dokumenten verfügbar, die ich im angegebenen Teil verlinken werde.
Antwort auf die Frage:
Wenn Ihre Schlüssel nur Zahlen sind, können Sie das sortierte Objekt sicher
Object.keys()
zusammen mitArray.prototype.reduce()
zurückgeben:Wenn Sie jedoch mit Zeichenfolgen arbeiten, empfehle ich dringend,
Array.prototype.sort()
all dies zu verketten :Wenn sich jemand fragt, was Reduzieren bewirkt:
Bei Bedarf finden Sie hier die Erklärung für den einen Liner:
Warum das Sortieren etwas kompliziert ist:
Kurz gesagt,
Object.keys()
wird ein Array mit der gleichen Reihenfolge zurückgegeben, die wir mit einer normalen Schleife erhalten:Nebenbemerkung - Sie können sie auch
Object.keys()
für Arrays verwenden. Beachten Sie jedoch , dass der Index zurückgegeben wird:Es ist jedoch nicht so einfach wie in diesen Beispielen gezeigt. Objekte der realen Welt können Zahlen und alphabetische Zeichen oder sogar Symbole enthalten (bitte nicht tun).
Hier ist ein Beispiel mit allen in einem Objekt:
Wenn wir nun
Array.prototype.sort()
das Array oben verwenden, ändert sich die Ausgabe:Hier ist ein Zitat aus den Dokumenten:
Sie müssen sicherstellen, dass einer von ihnen die gewünschte Ausgabe für Sie zurückgibt. In Beispielen aus der Praxis neigen Menschen dazu, Dinge zu verwechseln, insbesondere wenn Sie verschiedene Informationseingaben wie APIs und Datenbanken zusammen verwenden.
Also, was ist die große Sache?
Nun, es gibt zwei Artikel, die jeder Programmierer verstehen sollte:
In-Place-Algorithmus :
Im Grunde genommen wird unser altes Array überschrieben! Dies ist wichtig, wenn Sie das alte Array aus anderen Gründen beibehalten möchten. Denken Sie also daran.
Sortieralgorithmus
Dies zeigt, dass die Sortierung richtig ist, sich aber geändert hat. Selbst wenn die Sortierung korrekt ist, müssen wir in der realen Welt sicherstellen, dass wir das bekommen, was wir erwarten! Dies ist sehr wichtig. Denken Sie auch daran. Weitere JavaScript-Beispiele finden Sie in den Dokumenten Array.prototype.sort () - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
quelle
Object.keys(testObj).sort().reduce((a, c) => (a[c] = testObj[c], a), {})
.{5: 'hearts'}
oder{5: 'spades'}
Sie das Array sortieren, wird sie in Spielen wie Rommé möglicherweise instabil. Nicht von verschiedenen Sprachen zu sprechen.Das funktioniert bei mir
quelle
Es ist 2019 und wir haben 2019 einen Weg, dies zu lösen :)
quelle
Hier ist der 1 Liner
quelle
(o[k] = v, o)
. Warum funktioniert das überhaupt, wo finde ich Dokumente dazu? Es gibt offensichtlich den Parameter ganz rechts zurück, aber warum?o[k]
gleichv
und kehrt dann zurücko
Dies ist eine alte Frage, aber unter Berücksichtigung der Antwort von Mathias Bynens habe ich eine Kurzversion erstellt, um das aktuelle Objekt ohne großen Aufwand zu sortieren .
Nach der Codeausführung werden die Schlüssel für das "ungeordnete" Objekt selbst alphabetisch sortiert.
quelle
Mit lodash funktioniert dies:
Nur Denkanstöße.
quelle
Angenommen, es könnte im VisualStudio-Debugger nützlich sein, der ungeordnete Objekteigenschaften anzeigt.
quelle
Unterstreichungsversion :
Wenn Sie Ihrem Browser nicht vertrauen, dass er die Reihenfolge der Schlüssel beibehält, empfehle ich dringend, sich auf ein geordnetes Array von Schlüssel-Wert-gepaarten Arrays zu verlassen.
quelle
_.object(_.sortBy(_.pairs(unordered), _.first))
quelle
Vielleicht etwas elegantere Form:
PS und das gleiche mit ES6 + -Syntax:
quelle
rekursive Sortierung für verschachtelte Objekte und Arrays
quelle
else
daArray.isArray(obj[key])
typeof obj[key] === 'object'
function sortObjectKeys(obj){
:if(typeof obj != 'object'){ /* it is a primitive: number/string (in an array) */ return obj; }
. Ausif(obj == null || obj == undefined){ return obj; }
Wie bereits erwähnt, sind Objekte ungeordnet.
Jedoch...
Sie können diese Redewendung nützlich finden:
Sie können dann durch kv iterieren und tun, was Sie wollen.
quelle
Hier ist eine saubere Version auf Lodash-Basis, die mit verschachtelten Objekten funktioniert
Es wäre noch sauberer, wenn lodash eine
toObject()
Methode hätte ...quelle
Verwenden Sie einfach lodash, um die Karte zu entpacken und sortBy den ersten Wert von pair und zip erneut, um den sortierten Schlüssel zurückzugeben.
Wenn Sie einen Sortierwert wünschen, ändern Sie den Paarindex auf 1 anstelle von 0
quelle
Sortiert Schlüssel rekursiv unter Beibehaltung von Referenzen.
Beispiel:
quelle
delete o[e[0]];
dort? Können wir nicht einfach zuweisen?quelle
Dies ist eine einfache Lösung für alles, was ich für die JSON-Sortierung benötige.
quelle
Verwenden Sie diesen Code, wenn Sie verschachtelte Objekte oder ein verschachteltes Array obj haben.
quelle
Lösung:
Erläuterung:
Viele JavaScript-Laufzeiten speichern Werte in einem Objekt in der Reihenfolge, in der sie hinzugefügt werden.
Um die Eigenschaften eines Objekts nach ihren Schlüsseln zu sortieren, können Sie die Funktion Object.keys verwenden, die ein Array von Schlüsseln zurückgibt . Das Array von Schlüsseln kann dann nach Array.prototype.sort () sortiert werden. Methode die Elemente eines Arrays an Ort und Stelle (ohne dass sie einer neuen Variablen zugewiesen werden müssen).
Sobald die Schlüssel sortiert sind, können Sie sie einzeln verwenden, um auf den Inhalt des alten Objekts zuzugreifen und ein neues Objekt zu füllen (das jetzt sortiert ist).
Unten finden Sie ein Beispiel für das Verfahren (Sie können es in Ihren Zielbrowsern testen):
Hinweis: Object.keys ist eine ECMAScript 5.1-Methode, aber hier ist eine Polyfüllung für ältere Browser:
quelle
Ich habe einige Java-Enums auf Javascript-Objekte übertragen.
Diese Objekte haben für mich die richtigen Arrays zurückgegeben. Wenn die Objektschlüssel vom gemischten Typ sind (Zeichenfolge, Int, Zeichen), liegt ein Problem vor.
Code-Snippet anzeigen
quelle
Einfaches und lesbares Snippet mit lodash.
Sie müssen den Schlüssel nur in Anführungszeichen setzen, wenn Sie sortBy aufrufen. Es muss nicht in Anführungszeichen in den Daten selbst stehen.
Außerdem ist Ihr zweiter zuzuordnender Parameter falsch. Es sollte eine Funktion sein, aber das Zupfen ist einfacher.
quelle
Es gibt ein großartiges Projekt von @sindresorhus namens Sort-Keys, das fantastisch funktioniert.
Sie können den Quellcode hier überprüfen:
https://github.com/sindresorhus/sort-keys
Oder Sie können es mit npm verwenden:
Hier sind auch Codebeispiele aus seiner Readme
quelle
Reine JavaScript-Antwort zum Sortieren eines Objekts. Dies ist die einzige Antwort, von der ich weiß, dass sie mit negativen Zahlen umgeht. Diese Funktion dient zum Sortieren numerischer Objekte.
Eingabe obj = {1000: {}, -1200: {}, 10000: {}, 200: {}};
Die Ausgabe ist ein Objekt, das nach diesen Zahlen sortiert ist, wobei neue Schlüssel bei 0 beginnen.
quelle
Nur um es zu vereinfachen und die Antwort von Matt Ball klarer zu machen
quelle
Ich bin mir nicht sicher, ob dies die Frage beantwortet, aber das ist es, was ich brauchte.
Genannt als:
quelle
Die eine Zeile:
quelle
Der beste Weg, dies zu tun, ist
Sie können zuerst Ihr fast Array-ähnliches Objekt in ein reales Array konvertieren und dann .reverse () verwenden:
Der leere Slot am Ende, wenn Ursache, weil Ihr erster Index 1 statt 0 ist. Sie können den leeren Slot mit .length-- oder .pop () entfernen.
Wenn Sie alternativ .reverse ausleihen und für dasselbe Objekt aufrufen möchten, muss es sich um ein vollständig Array-ähnliches Objekt handeln. Das heißt, es benötigt eine Längeneigenschaft:
Beachten Sie, dass es dasselbe vollständig Array-ähnliche Objektobjekt zurückgibt, sodass es kein echtes Array ist. Anschließend können Sie mit delete die Eigenschaft length entfernen.
quelle