Ich habe ein mehrdimensionales Array. Das primäre Array ist ein Array von
[publicationID][publication_name][ownderID][owner_name]
Ich versuche, das Array nach owner_name
und dann nach zu sortieren publication_name
. Ich weiß, dass Sie in JavaScript haben Array.sort()
, in das Sie eine benutzerdefinierte Funktion einfügen können. In meinem Fall habe ich:
function mysortfunction(a, b) {
var x = a[3].toLowerCase();
var y = b[3].toLowerCase();
return ((x < y) ? -1 : ((x > y) ? 1 : 0));
}
Dies ist in Ordnung, wenn Sie nur nach der einen Spalte sortieren, nämlich dem Eigentümernamen. Wie ändere ich sie owner_name
dann, um danach zu sortieren publication_name
?
javascript
algorithm
sorting
Geschmack404
quelle
quelle
[[A, 10], [J, 15], [A, 5], [J, 5]] => [[A, 10], [A, 5], [J, 15], [J, 5]]
Ich denke, was Sie suchen, ist thenBy.js: https://github.com/Teun/thenBy.js
Sie können die Standard-Array.sort verwenden, jedoch mit
firstBy().thenBy().thenBy()
Stil.Ein Beispiel ist hier zu sehen .
quelle
thenBy
Aufruf werden alle Array-Elemente erneut durchlaufen.Eine gute Möglichkeit, nach vielen Feldern zu sortieren, die Zeichenfolgen sind, ist die Verwendung
toLocaleCompare
des booleschen Operators||
.Etwas wie:
Wenn Sie nach mehr Feldern sortieren möchten, können Sie diese einfach mit mehr booleschen Operatoren aus der return-Anweisung verketten.
quelle
.reduce()
.localCompare()
gibt ein -1, 0, 1 , damit ich Ihre Lösung nicht denken, wie die Arbeit || ist gut für BooleschesortItems = (a, b) => (a.distance - b.distance) || (a.name - b.name);
und es funktioniert wie ein Zauber für meine nicht wählerischen Bedürfnisse.(a.name - b.name)
wenn es nicht nötig ist. Das erstmalige Erstellen von Variablen erledigt zusätzliche Arbeit, auch wenn sie nicht benötigt wird.Es wurde festgestellt, dass gemischte Asc- und Desc-Objektarrays nach Schlüsseln im SQL-Stil sortiert werden müssen.
kennebecs obige Lösung hat mir dabei geholfen:
Beispielnutzung:
ergibt folgendes:
(mit einer Druckfunktion von hier )
hier ist ein jsbin beispiel .
edit: bereinigt und als mksort.js auf github gepostet .
quelle
Dies ist praktisch für Alpha-Sorten aller Größen. Übergeben Sie ihm die Indizes, nach denen Sie sortieren möchten, der Reihe nach als Argumente.
quelle
Ich schlage vor, einen eingebauten Vergleicher zu verwenden und die gewünschte Sortierreihenfolge mit logisch oder zu verketten
||
.Arbeitsbeispiel:
quelle
Sie können die beiden Variablen zu einem Sortierschlüssel zusammenfassen und für Ihren Vergleich verwenden.
quelle
Ich habe Multisotr gefunden . Dies ist eine einfache, leistungsstarke und kleine Bibliothek für die Mehrfachsortierung. Ich musste eine Reihe von Objekten mit dynamischen Sortierkriterien sortieren:
Diese Bibliothek ist mutch mächtiger, das war mein Fall. Versuch es.
quelle
Ich habe mit gearbeitet
ng-grid
einer Reihe von Datensätzen und musste sie nach mehreren Spalten sortieren, die von einer API zurückgegeben wurden. Deshalb habe ich mir diese raffinierte, dynamische Mehrsortierfunktion ausgedacht.Zunächst einmal
ng-grid
löst ein „Ereignis“ für „ngGridSorted“ und leitet diese Struktur zurück, beschreibt die Art:Also habe ich eine Funktion erstellt, die dynamisch eine Sortierfunktion basierend auf der
sortData
oben gezeigten generiert ( Keine Angst vor der Bildlaufleiste! Sie ist nur etwa 50 Zeilen lang! Außerdem tut mir der Slop leid. Sie hat eine Horizontale verhindert Bildlaufleiste! ):Ich sortiere dann die Ergebnisse meiner API (
results
) wie folgt :Ich hoffe, jemand anderes genießt diese Lösung genauso wie ich! Vielen Dank!
quelle
Versuche dies:
Code-Snippet anzeigen
Ich
let t = [ [publicationID, publication_name, ownderID, owner_name ], ... ]
gehe davon aus, dass Ihre Daten in einem Array mit dem Index von Eignername = 3 und Publikationsname = 1 vorliegen.quelle
Methode zum Anhängen von Zeichenfolgen
Sie können nach mehreren Werten sortieren, indem Sie die Werte einfach in eine Zeichenfolge einfügen und die Zeichenfolgen vergleichen. Es ist hilfreich, ein geteiltes Schlüsselzeichen hinzuzufügen, um ein Abfließen von einem Schlüssel zum nächsten zu verhindern.
Beispiel
quelle
quelle
Ich hatte ein ähnliches Problem beim Anzeigen von Speicherpoolblöcken aus der Ausgabe einer virtuellen DOM-h-Funktionskomposition. Grundsätzlich hatte ich das gleiche Problem wie das Sortieren von Daten mit mehreren Kriterien, wie das Bewerten von Ergebnissen von Spielern auf der ganzen Welt.
Ich habe festgestellt, dass die Sortierung nach mehreren Kriterien wie folgt lautet:
Und wenn es Sie nicht interessiert, könnten Sie schnell in einer Wenn-sonst-Nesting-Hölle scheitern ... wie einem Rückruf der Hölle der Versprechen ...
Was ist, wenn wir eine "Prädikat" -Funktion schreiben, um zu entscheiden, ob welcher Teil der Alternative verwendet wird? Das Prädikat ist einfach:
Nachdem Sie Ihre Klassifizierungstests (byCountrySize, byAge, byGameType, byScore, byLevel ...) geschrieben haben, können Sie Ihre Tests (1 = asc, -1 = desc, 0 = disable) in ein Array einfügen und wenden Sie eine reduzierende Entscheidungsfunktion wie folgt an:
Und voila! Es liegt an Ihnen, Ihre eigenen Kriterien / Gewichte / Ordnungen zu definieren ... aber Sie haben die Idee. Hoffe das hilft !
BEARBEITEN: * Stellen Sie sicher, dass für jede Spalte eine Gesamtsortierreihenfolge vorhanden ist. * Beachten Sie, dass keine Abhängigkeiten zwischen den Spaltenreihenfolgen und keine zirkulären Abhängigkeiten bestehen
Wenn nicht, kann die Sortierung instabil sein!
quelle
Meine eigene Bibliothek für die Arbeit mit ES6-Iterables (blinq) ermöglicht (unter anderem) eine einfache mehrstufige Sortierung
quelle
Von GitHub bezogen
quelle
Ich habe gerade eine Mikrobibliothek namens sort-helper ( Quelle auf Github ) bei npm veröffentlicht . Die Idee ist, den Helfer zu importieren
by
, um die Vergleichsfunktion für diesort
Array-Methode über die Syntax zu erstellenitems.sort(by(column, ...otherColumns))
, wobei die zu sortierenden Spalten auf verschiedene Arten ausgedrückt werden können:persons.sort(by('lastName', 'firstName'))
,dates.sort(by(x => x.toISOString()))
,[3, 2, 4, 1].sort(by(desc(n => n)))
→[3, 2, 1, 0]
,['B', 'D', 'c', 'a'].sort(by(ignoreCase(x => x))).join('')
→'aBcD'
.Es ist ähnlich wie das nette thenBy, das in dieser Antwort erwähnt wird, aber mit den folgenden Unterschieden, die eher dem Geschmack einiger entsprechen können:
thenBy
fließende API) .quelle