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 mit Array.prototype.reduce()
zurückgeben:
// Only numbers to show it will be sorted.
const testObj = {
'2000': 'Articel1',
'4000': 'Articel2',
'1000': 'Articel3',
'3000': 'Articel4',
};
// I'll explain what reduces does after the answer.
console.log(Object.keys(testObj).reduce((accumulator, currentValue) => {
accumulator[currentValue] = testObj[currentValue];
return accumulator;
}, {}));
/**
* expected output:
* {
* '1000': 'Articel3',
* '2000': 'Articel1',
* '3000': 'Articel4',
* '4000': 'Articel2'
* }
*/
// if needed here is the one liner:
console.log(Object.keys(testObj).reduce((a, c) => (a[c] = testObj[c], a), {}));
Wenn Sie jedoch mit Zeichenfolgen arbeiten, empfehle ich dringend, Array.prototype.sort()
all dies zu verketten :
// String example
const testObj = {
'a1d78eg8fdg387fg38': 'Articel1',
'z12989dh89h31d9h39': 'Articel2',
'f1203391dhj32189h2': 'Articel3',
'b10939hd83f9032003': 'Articel4',
};
// Chained sort into all of this.
console.log(Object.keys(testObj).sort().reduce((accumulator, currentValue) => {
accumulator[currentValue] = testObj[currentValue];
return accumulator;
}, {}));
/**
* expected output:
* {
* a1d78eg8fdg387fg38: 'Articel1',
* b10939hd83f9032003: 'Articel4',
* f1203391dhj32189h2: 'Articel3',
* z12989dh89h31d9h39: 'Articel2'
* }
*/
// again the one liner:
console.log(Object.keys(testObj).sort().reduce((a, c) => (a[c] = testObj[c], a), {}));
Wenn sich jemand fragt, was Reduzieren bewirkt:
// Will return Keys of object as an array (sorted if only numbers or single strings like a,b,c).
Object.keys(testObj)
// Chaining reduce to the returned array from Object.keys().
// Array.prototype.reduce() takes one callback
// (and another param look at the last line) and passes 4 arguments to it:
// accumulator, currentValue, currentIndex and array
.reduce((accumulator, currentValue) => {
// setting the accumulator (sorted new object) with the actual property from old (unsorted) object.
accumulator[currentValue] = testObj[currentValue];
// returning the newly sorted object for the next element in array.
return accumulator;
// the empty object {} ist the initial value for Array.prototype.reduce().
}, {});
Bei Bedarf finden Sie hier die Erklärung für den einen Liner:
Object.keys(testObj).reduce(
// Arrow function as callback parameter.
(a, c) =>
// parenthesis return! so we can safe the return and write only (..., a);
(a[c] = testObj[c], a)
// initial value for reduce.
,{}
);
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:
const object1 = {
a: 'somestring',
b: 42,
c: false
};
console.log(Object.keys(object1));
// expected output: Array ["a", "b", "c"]
Object.keys () gibt ein Array zurück, dessen Elemente Zeichenfolgen sind, die den aufzählbaren Eigenschaften entsprechen, die direkt auf dem Objekt gefunden werden. Die Reihenfolge der Eigenschaften entspricht der Reihenfolge, in der die Eigenschaften des Objekts manuell durchlaufen werden.
Nebenbemerkung - Sie können sie auch Object.keys()
für Arrays verwenden. Beachten Sie jedoch , dass der Index zurückgegeben wird:
// simple array
const arr = ['a', 'b', 'c'];
console.log(Object.keys(arr)); // console: ['0', '1', '2']
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:
// This is just to show what happens, please don't use symbols in keys.
const testObj = {
'1asc': '4444',
1000: 'a',
b: '1231',
'#01010101010': 'asd',
2: 'c'
};
console.log(Object.keys(testObj));
// output: [ '2', '1000', '1asc', 'b', '#01010101010' ]
Wenn wir nun Array.prototype.sort()
das Array oben verwenden, ändert sich die Ausgabe:
console.log(Object.keys(testObj).sort());
// output: [ '#01010101010', '1000', '1asc', '2', 'b' ]
Hier ist ein Zitat aus den Dokumenten:
Die sort () -Methode sortiert die Elemente eines Arrays an Ort und Stelle und gibt das Array zurück. Die Sortierung ist nicht unbedingt stabil. Die Standardsortierreihenfolge entspricht den Zeichenfolgen-Unicode-Codepunkten.
Die zeitliche und räumliche Komplexität der Sortierung kann nicht garantiert werden, da sie implementierungsabhängig ist.
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 :
In der Informatik ist ein In-Place-Algorithmus ein Algorithmus, der Eingaben ohne Hilfsdatenstruktur transformiert. Für Hilfsvariablen ist jedoch ein geringer zusätzlicher Speicherplatz zulässig. Die Eingabe wird normalerweise von der Ausgabe überschrieben, wenn der Algorithmus ausgeführt wird. Der In-Place-Algorithmus aktualisiert die Eingabesequenz nur durch Ersetzen oder Austauschen von Elementen. Ein Algorithmus, der nicht vorhanden ist, wird manchmal als nicht vorhanden oder nicht vorhanden bezeichnet.
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
Stabile Sortieralgorithmen sortieren identische Elemente in derselben Reihenfolge, in der sie in der Eingabe erscheinen. Beim Sortieren einiger Arten von Daten wird bei der Bestimmung der Sortierreihenfolge nur ein Teil der Daten untersucht. Im Beispiel für die Kartensortierung rechts werden die Karten beispielsweise nach ihrem Rang sortiert und ihre Farbe wird ignoriert. Dies ermöglicht die Möglichkeit mehrerer verschiedener korrekt sortierter Versionen der ursprünglichen Liste. Stabile Sortieralgorithmen wählen eine davon gemäß der folgenden Regel aus: Wenn zwei Elemente wie die beiden 5 Karten als gleich verglichen werden, bleibt ihre relative Reihenfolge erhalten, sodass dies auch der Fall ist, wenn eines in der Eingabe vor dem anderen kam kommen vor dem anderen in der Ausgabe.
Ein Beispiel für eine stabile Sortierung auf Spielkarten. Wenn die Karten nach Rang mit einer stabilen Sortierung sortiert sind, müssen die beiden 5er in der sortierten Ausgabe, in der sie sich ursprünglich befanden, in derselben Reihenfolge bleiben. Wenn sie mit einer nicht stabilen Sortierung sortiert werden, können die 5er in der entgegengesetzten Richtung enden Reihenfolge in der sortierten Ausgabe.
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