Wie würde ich nach dieser ursprünglichen Frage eine Sortierung auf mehrere Felder anwenden?
Wie würde ich mit dieser leicht angepassten Struktur die Stadt (aufsteigend) und dann den Preis (absteigend) sortieren?
var homes = [
{"h_id":"3",
"city":"Dallas",
"state":"TX",
"zip":"75201",
"price":"162500"},
{"h_id":"4",
"city":"Bevery Hills",
"state":"CA",
"zip":"90210",
"price":"319250"},
{"h_id":"6",
"city":"Dallas",
"state":"TX",
"zip":"75000",
"price":"556699"},
{"h_id":"5",
"city":"New York",
"state":"NY",
"zip":"00010",
"price":"962500"}
];
Ich mochte die Tatsache, dass eine Antwort gegeben wurde, die einen allgemeinen Ansatz lieferte. Wo ich diesen Code verwenden möchte, muss ich Datumsangaben und andere Dinge sortieren. Die Fähigkeit, das Objekt zu "grundieren", schien praktisch, wenn nicht sogar etwas umständlich.
Ich habe versucht, diese Antwort in ein schönes allgemeines Beispiel zu integrieren, aber ich habe nicht viel Glück.
javascript
arrays
sorting
Mike
quelle
quelle
sort(["first-field", "ASC"], ["second-field", "DSC"]);
Dies ist noch komplizierter, wenn ich versuche, die "Primer" -Logik der ersten Antwort hinzuzufügen, damit ich mit Datumsangaben, Groß- und Kleinschreibung usw. umgehen kannAntworten:
Eine mehrdimensionale Sortiermethode, basierend auf dieser Antwort :
Update : Hier ist eine "optimierte" Version. Es führt viel mehr Vorverarbeitung durch und erstellt zuvor eine Vergleichsfunktion für jede Sortieroption. Es benötigt möglicherweise mehr Speicher (da es eine Funktion für jede Sortieroption speichert, sollte sich jedoch etwas besser entwickeln, da während des Vergleichs nicht die richtigen Einstellungen ermittelt werden müssen. Ich habe jedoch keine Profilerstellung durchgeführt.
Anwendungsbeispiel:
DEMO
Ursprüngliche Funktion:
DEMO
quelle
für eine nicht generische, einfache Lösung für Ihr genaues Problem:
quelle
if
Anweisung macht keinen Sinn.a.localeCompare(b)
in der letzten Zeile für den Zeichenfolgenvergleich verwenden ... siehe die Dokumenteif (a.city === b.city)
? Das heißt, wenn die beiden Städte gleich sind, vergleichen Sie die Preise, andernfalls vergleichen Sie die Städte.Sie können einen verketteten Sortieransatz verwenden, indem Sie das Delta der Werte verwenden, bis es einen Wert ungleich Null erreicht.
Oder mit es6 einfach:
quelle
Hier ist ein einfacher funktionaler Ansatz. Geben Sie die Sortierreihenfolge mithilfe des Arrays an. Stellen Sie ein Minus voran , um die absteigende Reihenfolge anzugeben.
Edit: in ES6 ist es noch kürzer!
quelle
[10,100,11,9]
. Habe ich etwas verpasst?Ich habe heute einen ziemlich generischen Multifunktionssortierer erstellt. Sie können sich thenBy.js hier ansehen: https://github.com/Teun/thenBy.js
Sie können die Standard-Array.sort verwenden, jedoch mit dem Stil firstBy (). ThenBy (). ThenBy (). Es ist viel weniger Code und Komplexität als die oben beschriebenen Lösungen.
quelle
Mit der folgenden Funktion können Sie ein Array von Objekten nach einer oder mehreren Eigenschaften sortieren, entweder aufsteigend (Standard) oder absteigend für jede Eigenschaft, und Sie können auswählen, ob Vergleiche zwischen Groß- und Kleinschreibung durchgeführt werden sollen oder nicht. Standardmäßig führt diese Funktion Sortierungen ohne Berücksichtigung der Groß- und Kleinschreibung durch.
Das erste Argument muss das Array sein, das die Objekte enthält. Die nachfolgenden Argumente müssen eine durch Kommas getrennte Liste von Zeichenfolgen sein, die auf die verschiedenen Objekteigenschaften verweisen, nach denen sortiert werden soll. Das letzte Argument (das optional ist) ist ein Boolescher Wert, mit dem ausgewählt wird, ob Sortierungen mit
true
Groß- und Kleinschreibung durchgeführt werden sollen oder nicht .Die Funktion sortiert jede Eigenschaft / jeden Schlüssel standardmäßig in aufsteigender Reihenfolge. Wenn Sie möchten, dass ein bestimmter Schlüssel in absteigender Reihenfolge sortiert wird, übergeben Sie stattdessen ein Array in diesem Format :
['property_name', true]
.Hier sind einige Anwendungsbeispiele für die Funktion, gefolgt von einer Erklärung (wobei
homes
sich ein Array mit den Objekten befindet):objSort(homes, 'city')
-> nach Stadt sortieren (aufsteigend, Groß- und Kleinschreibung nicht berücksichtigen)objSort(homes, ['city', true])
-> nach Stadt sortieren (absteigend, Groß- und Kleinschreibung nicht berücksichtigt)objSort(homes, 'city', true)
-> nach Stadt sortieren, dann Preis (aufsteigend, Groß- und Kleinschreibung beachten )objSort(homes, 'city', 'price')
-> nach Stadt sortieren, dann Preis (beide aufsteigend, Groß- und Kleinschreibung nicht berücksichtigt)objSort(homes, 'city', ['price', true])
-> nach Stadt sortieren (aufsteigend), dann Preis (absteigend), Groß- und Kleinschreibung beachten)Und ohne weiteres, hier ist die Funktion:
Und hier einige Beispieldaten:
quelle
Dies ist ein kompletter Cheat, aber ich denke, dass er dieser Frage einen Mehrwert verleiht, da es sich im Grunde um eine vordefinierte Bibliotheksfunktion handelt, die Sie sofort verwenden können.
Wenn Ihr Code Zugriff auf
lodash
oder eine lodash-kompatible Bibliothek wie dieseunderscore
hat, können Sie die_.sortBy
Methode verwenden. Das folgende Snippet wird direkt aus der lodash-Dokumentation kopiert .Die kommentierten Ergebnisse in den Beispielen sehen so aus, als würden sie Arrays von Arrays zurückgeben, aber das zeigt nur die Reihenfolge und nicht die tatsächlichen Ergebnisse, die ein Array von Objekten sind.
quelle
Hier ist eine andere, die Ihrer Idee für die Syntax vielleicht näher kommt
Demo: http://jsfiddle.net/Nq4dk/2/
Bearbeiten: Nur zum Spaß, hier ist eine Variante , die nur eine SQL-ähnliche Zeichenfolge benötigt, damit Sie dies tun können
sortObjects(homes, "city, price desc")
quelle
Einfacher:
quelle
Ich mag den Ansatz von SnowBurnt, aber es bedarf einer Optimierung, um die Gleichwertigkeit der Stadt zu testen, KEIN Unterschied.
quelle
Hier ist eine generische mehrdimensionale Sortierung, die das Umkehren und / oder Zuordnen auf jeder Ebene ermöglicht.
Geschrieben in Typoskript. Informationen zu Javascript finden Sie in dieser JSFiddle
Der Code
Anwendungsbeispiele
Sortieren eines Personenarrays nach Nachname und Vorname:
Sortieren Sie Sprachcodes nach ihrem Namen , nicht nach ihrem Sprachcode (siehe
map
), und dann nach absteigender Version (siehereverse
).quelle
Ein dynamischer Weg, dies mit MULTIPLE-Tasten zu tun:
Verwenden:
quelle
Hier ist eine generische Version der @ Snowburnt-Lösung:
Dies basiert auf einer Sortierroutine, die ich verwende. Ich habe diesen speziellen Code nicht getestet, daher kann es zu Fehlern kommen, aber Sie haben die Idee. Die Idee ist, nach dem ersten Feld zu sortieren, das einen Unterschied anzeigt, und dann anzuhalten und zum nächsten Datensatz zu wechseln. Wenn Sie also nach drei Feldern sortieren und das erste Feld im Vergleich ausreicht, um die Sortierreihenfolge der beiden zu sortierenden Datensätze zu bestimmen, geben Sie das Sortierergebnis zurück und fahren Sie mit dem nächsten Datensatz fort.
Ich habe es (eigentlich mit einer etwas komplexeren Sortierlogik) an 5000 Datensätzen getestet und es hat es im Handumdrehen geschafft. Wenn Sie tatsächlich mehr als 1000 Datensätze auf den Client laden, sollten Sie wahrscheinlich die serverseitige Sortierung und Filterung verwenden.
Dieser Code behandelt nicht die Groß- und Kleinschreibung, aber ich überlasse es dem Leser, diese triviale Änderung zu behandeln.
quelle
Hier ist meine Lösung, die auf der Schwartzschen Transformationssprache basiert. Ich hoffe, Sie finden sie nützlich.
Hier ist ein Beispiel für die Verwendung:
quelle
Ein anderer Weg
quelle
Verwendung des (Put- (Minus-) Zeichens vor dem Feld, wenn Sie ein bestimmtes Feld in absteigender Reihenfolge sortieren möchten)
Mit der obigen Funktion können Sie jedes JSON-Array mit mehreren Feldern sortieren. Der Funktionskörper muss überhaupt nicht geändert werden
quelle
Anpassung der Antwort von @chriskelly.
Die meisten Antworten übersehen, dass der Preis nicht richtig sortiert wird, wenn der Wert bei Zehntausenden und darunter oder über einer Million liegt. Der Grund für JS ist alphabetisch sortiert. Es war ziemlich gut hier beantwortet, Warum kann JavaScript Art „5, 10, 1“ und hier , wie ein Array von ganzen Zahlen richtig zu sortieren .
Letztendlich müssen wir eine Bewertung vornehmen, wenn das Feld oder der Knoten, nach dem wir sortieren, eine Zahl ist. Ich sage nicht, dass die Verwendung
parseInt()
in diesem Fall die richtige Antwort ist, die sortierten Ergebnisse sind wichtiger.Eine Geige zum Testen
quelle
price
im Beispiel ist im String-Format. Wenn Sie möchten, dass es mit meinem Beispiel richtig funktioniert, verwenden Sie map, um das Feld zu konvertieren, das Sie zuerst im Zahlenformat formatieren möchten. dhconst correctedHomes = homes.map(h => ({...h, price: +h.price}))
Wow, hier gibt es einige komplexe Lösungen. So komplex, dass ich mich für etwas Einfacheres, aber auch ziemlich Mächtiges entschieden habe. Hier ist es;
Und hier ist ein Beispiel, wie Sie es verwenden.
Dies wird zuerst nach der Priorität der Attribute und dann nach dem Wert der Attribute sortiert.
quelle
Hier ist eine erweiterbare Möglichkeit, nach mehreren Feldern zu sortieren.
Anmerkungen
a.localeCompare(b)
wird allgemein unterstützt und kehrt -1,0,1 wenna<b
,a==b
,a>b
bzw..||
in der letzten Zeile gibtcity
Vorrang vorprice
.-price_order
var date_order = new Date(left.date) - new Date(right.date);
funktioniert wie Numerik , weil Datum Mathematik seit 1970 in Millisekunden schaltet.return city_order || -price_order || date_order;
quelle
Ich denke, dies ist vielleicht der einfachste Weg, dies zu tun.
https://coderwall.com/p/ebqhca/javascript-sort-by-two-fields
Es ist wirklich einfach und ich habe es mit 3 verschiedenen Schlüsselwertpaaren versucht und es hat großartig funktioniert.
Hier ist ein einfaches Beispiel. Weitere Informationen finden Sie unter dem Link
quelle
Hier ist meine als Referenz, mit Beispiel:
quelle
Ich suchte nach etwas Ähnlichem und endete damit:
Zuerst haben wir eine oder mehrere Sortierfunktionen, die immer entweder 0, 1 oder -1 zurückgeben:
Sie können weitere Funktionen für jede andere Eigenschaft erstellen, nach der Sie sortieren möchten.
Dann habe ich eine Funktion, die diese Sortierfunktionen zu einer kombiniert:
Dies kann verwendet werden, um die oben genannten Sortierfunktionen lesbar zu kombinieren:
Wenn eine Sortierfunktion 0 zurückgibt, wird die nächste Sortierfunktion zur weiteren Sortierung aufgerufen.
quelle
Nur eine weitere Option. Verwenden Sie die folgende Dienstprogrammfunktion:
Anwendungsbeispiel (in Ihrem Fall):
Es sollte beachtet werden, dass diese Funktion noch allgemeiner sein kann, um verschachtelte Eigenschaften wie 'address.city' oder 'style.size.width' usw. verwenden zu können.
quelle
Dies ist ein rekursiver Algorithmus zum Sortieren nach mehreren Feldern, während die Möglichkeit besteht, Werte vor dem Vergleich zu formatieren.
Wenn a und b gleich sind, wird nur das nächste Feld ausprobiert, bis keines mehr verfügbar ist.
quelle
quelle
Hier sind 'AffiliateDueDate' und 'Title' Spalten, die beide in aufsteigender Reihenfolge sortiert sind.
quelle
Sortieren nach zwei Datumsfeldern und einem Beispiel für ein numerisches Feld:
http://jsfiddle.net/hcWgf/57/
quelle
Verwenden von:
Code-Snippet anzeigen
quelle
Wie wäre es mit dieser einfachen Lösung:
Basierend auf dieser Frage sortiert Javascript das Array nach mehreren (Zahlen-) Feldern
quelle