Wenn ich ein JavaScript-Objekt habe wie:
var list = {
"you": 100,
"me": 75,
"foo": 116,
"bar": 15
};
Gibt es eine Möglichkeit, die Eigenschaften nach Wert zu sortieren? Damit ich am Ende mit
list = {
"bar": 15,
"me": 75,
"you": 100,
"foo": 116
};
javascript
sorting
properties
object
Steerpike
quelle
quelle
Object.entries
Antwort, die der sauberste und am besten lesbare Stand der Technik seit ES2017 ist: stackoverflow.com/a/37607084/245966Antworten:
Verschieben Sie sie in ein Array, sortieren Sie das Array und verwenden Sie es dann für Ihre Zwecke. Hier ist eine Lösung:
Sobald Sie das Array haben, können Sie das Objekt aus dem Array in der gewünschten Reihenfolge neu erstellen und so genau das erreichen, was Sie sich vorgenommen haben. Das würde in allen mir bekannten Browsern funktionieren, aber es würde von einer Implementierungs-Eigenart abhängen und könnte jederzeit kaputt gehen. Sie sollten niemals Annahmen über die Reihenfolge der Elemente in einem JavaScript-Objekt treffen.
quelle
keys()
wird nur von IE9 + (und anderen modernen Browsern) unterstützt, wenn dies von Belang ist.keys()
Schließt auch aufzählbare Eigenschaften aus der Prototypenkette der Elemente aus (im Gegensatz zu for..in) - aber das ist normalerweise wünschenswerter._.pairs
verwandelt ein Objekt in [[Schlüssel1, Wert1], [Schlüssel2, Wert2]]. Rufen Sie dann sort an. Rufen Sie_.object
es dann an, um es zurückzudrehen.Wir möchten nicht die gesamte Datenstruktur duplizieren oder ein Array verwenden, für das wir ein assoziatives Array benötigen.
Hier ist eine andere Möglichkeit, dasselbe wie Bonna zu tun:
quelle
keysSorted
ist ein Array! Kein Objekt!.map(key => list[key]);
am Ende der Sortierung hinzufügen , wird das gesamte Objekt anstelle nur des Schlüssels zurückgegebenIhre Objekte können beliebig viele Eigenschaften haben, und Sie können wählen, ob Sie nach einer beliebigen Objekteigenschaft, einer beliebigen Nummer oder einer beliebigen Zeichenfolge sortieren möchten, wenn Sie die Objekte in ein Array einfügen. Betrachten Sie dieses Array:
sortieren nach Geburtsdatum, älteste zuerst
Nach Name sortieren
http://jsfiddle.net/xsM5s/16/
quelle
substr
das erste Zeichen enthalten. sonstDiana
undDebra
haben eine undefinierte Reihenfolge. Außerdem verwendet IhrebyDate
Sorte tatsächlichnum
nichtborn
.x.localeCompare(y)
localCompare
sieht nach einer sehr nützlichen Funktion aus! Beachten Sie nur, dass es nicht in jedem Browser unterstützt wird - IE 10 und weniger, Safari Mobile 9 und weniger.Der Vollständigkeit halber gibt diese Funktion ein sortiertes Array von Objekteigenschaften zurück:
Jsfiddle mit dem obigen Code ist hier . Diese Lösung basiert auf diesem Artikel .
Die aktualisierte Geige zum Sortieren von Zeichenfolgen finden Sie hier. Sie können beide zusätzlichen .toLowerCase () -Konvertierungen für den Vergleich von Zeichenfolgen mit Groß- und Kleinschreibung entfernen.
quelle
ECMAScript 2017 wird vorgestellt
Object.values / Object.entries
. Wie der Name schon sagt, fasst der erstere alle Werte eines Objekts zu einem Array zusammen, und der letztere fasst das gesamte Objekt zu einem Array von[key, value]
Arrays zusammen. Pythons Äquivalent zudict.values()
unddict.items()
.Die Funktionen machen es ziemlich einfach, jeden Hash in ein geordnetes Objekt zu sortieren. Ab sofort unterstützt nur ein kleiner Teil der JavaScript - Plattformen sie , aber Sie können es auf Firefox 47+ versuchen.
quelle
Sorting JavaScript Object by property value
? Sie haben die Frage, glaube ich, falsch verstanden, da Sie das ursprüngliche Objekt ändern und kein neues Array daraus erstellen sollen.Eine "Pfeil" -Version der Antwort von @marcusR als Referenz
UPDATE: April 2017 - Dies gibt ein
myObj
oben definiertes sortiertes Objekt zurück.Probieren Sie es hier aus!
UPDATE: Oktober 2018 - Object.entries-Version
Probieren Sie es hier aus!
quelle
var myObj = {"1": {"Value": 40}, "2": {"Value": 10}, "3": {"Value": 30}, "4": {"Value": 20}};
entries
. Nach dem Standard ist ein Objekt eine ungeordnete Sammlung von Eigenschaften . Das heißt, wenn Sie versuchen, das neue Objekt nach dem Sortieren nach Eigenschaftswert oder etwas anderem zu erstellen, wird die Reihenfolge der Eigenschaftsschlüssel wieder undefiniert. Chrome zum Beispiel bestellt standardmäßig die Eigenschaftsschlüssel, daher ist jeder Versuch, sie anders zu bestellen, nutzlos. Ihre einzige Chance besteht darin, einen "Index" basierend auf Ihren Bestelleinstellungen zu erhalten und das ursprüngliche Objekt entsprechend zu durchlaufen.sort()
aufObject.entries()
JavaScript-Objekte sind per Definition ungeordnet (siehe ECMAScript-Sprachspezifikation , Abschnitt 8.6). Die Sprachspezifikation garantiert nicht einmal, dass beim zweimaligen Durchlaufen der Eigenschaften eines Objekts diese beim zweiten Mal in derselben Reihenfolge angezeigt werden.
Wenn Sie Dinge bestellen möchten, verwenden Sie ein Array und die Methode Array.prototype.sort.
quelle
OK , wie Sie vielleicht wissen, hat Javascript die Funktion sort () , um Arrays zu sortieren, aber nichts für Objekte ...
In diesem Fall müssen wir also irgendwie ein Array der Schlüssel abrufen und sie sortieren. Dies ist der Grund, warum das Apis Ihnen die meiste Zeit Objekte in einem Array zur Verfügung stellt, da Array ohnehin mehr native Funktionen zum Spielen hat als Objektliteral. Die schnelle Lösung verwendet Object.key, das ein Array der Objektschlüssel zurückgibt. Ich erstelle die ES6- Funktion, die die Arbeit für Sie erledigt. Sie verwendet native Funktionen sort () und redu () in Javascript:
Und jetzt können Sie es so verwenden:
Überprüfen Sie das sortierte MyObject und Sie können das Ergebnis nach Schlüsseln wie folgt sortiert sehen:
Auch auf diese Weise wird das Hauptobjekt nicht berührt und wir erhalten tatsächlich ein neues Objekt.
Ich erstelle auch das Bild unten, um die Funktionsschritte klarer zu machen, falls Sie es ein wenig ändern müssen, um es auf Ihre Weise zu bearbeiten:
quelle
c: 3
zuc: 13
und Sie werden sehen, wie es auseinander fällt.quelle
Update mit ES6: Wenn Ihr Anliegen ein sortiertes Objekt zum Durchlaufen hat (weshalb ich mir vorstellen würde, dass Sie Ihre Objekteigenschaften sortieren möchten), können Sie das Map- Objekt verwenden.
Sie können Ihre (Schlüssel-, Wert-) Paare in sortierter Reihenfolge einfügen. Wenn Sie dann eine
for..of
Schleife ausführen, wird sichergestellt, dass sie in der Reihenfolge wiederholt werden, in der Sie sie eingefügt habenquelle
for-in
oder eingehalten zu werdenObject.keys
, aber sie wird definiert, um vonObject.getOwnPropertyNames
und den anderen neuen Methoden für den Zugriff auf Eigenschaftsnamen-Arrays eingehalten zu werden . Das ist also eine andere Option.Map
Sie tatsächlich eine Datenstruktur haben, die in sortierter Reihenfolge gespeichert werden kann (sortieren Sie Ihre Daten, durchlaufen Sie sie und speichern Sie sie in der Karte), wobei Ihnen dies nicht garantiert ist Objekte.Underscore.js oder Lodash.js für erweiterte Array- oder Objektsortierungen
Demo
quelle
Sehr kurz und einfach!
quelle
Ich folge der Lösung von slebetman (lesen Sie sie für alle Details), aber angepasst, da Ihr Objekt nicht verschachtelt ist.
quelle
Sortieren Sie Werte ohne mehrere for-Schleifen (um nach den Schlüsseln zu sortieren, ändern Sie den Index im Sortierrückruf auf "0").
quelle
Dies könnte eine einfache Möglichkeit sein, es als real geordnetes Objekt zu behandeln. Ich bin mir nicht sicher, wie langsam es ist. könnte auch besser mit einer while-Schleife sein.
Und dann fand ich diese Invertierungsfunktion von: http://nelsonwells.net/2011/10/swap-object-key-and-values-in-javascript/
Damit
quelle
Ausgabe = [{p: 8}, {c: 2}, {b: 1}, {g: 1}]
quelle
Nur für den Fall, dass jemand versucht, das Objekt (mit Schlüsseln und Werten) unter Verwendung der Code-Referenz von @Markus R und @James Moran zu behalten, verwenden Sie einfach:
quelle
map
,forEach
wäre besserAusgabe:
quelle
viele ähnliche und nützliche Funktionen: https://github.com/shimondoodkin/groupbyfunctions/
quelle
Objekt sortiert nach Wert (DESC)
quelle
Hier ist noch ein Beispiel:
quelle
quelle
Typoskript
Die folgende Funktion sortiert das Objekt nach Wert oder einer Eigenschaft des Werts. Wenn Sie TypeScript nicht verwenden, können Sie die Typinformationen entfernen, um sie in JavaScript zu konvertieren.
Verwendungszweck
Die Reihenfolge der Schlüssel in einem JavaScript-Objekt kann nicht garantiert werden. Daher sortiere ich das Ergebnis und gebe es als
Map
Objekt zurück, das die Sortierreihenfolge beibehält.Wenn Sie es wieder in Object konvertieren möchten, können Sie dies tun:
quelle
Eingabe ist Objekt, Ausgabe ist Objekt, unter Verwendung der in lodash & js integrierten Bibliothek mit absteigender oder aufsteigender Option, und mutiert das Eingabeobjekt nicht
zB Eingabe & Ausgabe
Die Umsetzung
quelle
quelle
meine Lösung mit sort:
quelle
quelle
Ein anderer Weg, um dies zu lösen: -
// res hat das Ergebnisarray
quelle
Vielen Dank und weiterhin antworten @Nosredna
Nachdem wir verstanden haben, dass das Objekt in ein Array konvertiert werden muss, sortieren Sie das Array. Dies ist nützlich, um das Array (oder das konvertierte Objekt in Array) nach Zeichenfolge zu sortieren:
quelle
Versuche dies. Selbst wenn Ihr Objekt nicht über die Eigenschaft verfügt, nach der Sie sortieren möchten, wird dies ebenfalls behandelt.
Rufen Sie es einfach auf, indem Sie eine Eigenschaft mit einem Objekt senden.
quelle