Wie sortiert man ein multidimensionales Array nach mehreren Spalten in JavaScript?

7

Ich habe den ganzen Tag ohne eine gute Lösung an diesem Problem gearbeitet. Google war auch wenig Hilfe. Ich habe ein Skript, das ein zweidimensionales Array mit einer unbekannten Anzahl von Zeilen / Spalten akzeptieren muss. Das Skript muss außerdem ein eindimensionales Array akzeptieren, das eine Liste von Spalten enthält, nach denen sortiert werden soll, und ein anderes, das die Sortierreihenfolge enthält. Der Anruf wird ungefähr so ​​aussehen:

%Vor%

Die Funktion do2DArraySort sollte das Array dataArr nach der ersten Spalte (in aufsteigender Reihenfolge), dann nach der fünften (in absteigender Reihenfolge), dann nach der dritten (in absteigender Reihenfolge) und dann nach der zweiten (in absteigender Reihenfolge) zurückgeben ). Ich konnte es mit dem unten stehenden Code zwei Ebenen tief machen, aber es fiel auseinander, als ich versuchte, eine dritte Sortierspalte hinzuzufügen. Ich verstehe warum, aber ich kann keinen guten Weg finden, es zum Laufen zu bringen.

Gibt es eine Standardmethode, dies zu tun? Kann mir jemand ein gutes Skript online zeigen, das ich studieren und als Vorlage verwenden kann? Oder kann jemand eine Änderung an meinem Code vorschlagen, damit es funktioniert?

Danke!

%Vor%     
Nicholas 23.05.2011, 18:45
quelle

3 Antworten

23

Das Array-Literal [] wird gegenüber new Array bevorzugt. Die Notation {0,4,3,1} ist nicht gültig und sollte [0,4,3,1] sein.

Muss das Rad neu erfunden werden? Zwei Arrays können miteinander verbunden werden:

%Vor%

Elemente können an das Ende angehängt werden mit:

%Vor%

Arrays haben eine Methode zum Sortieren des Arrays. Standardmäßig ist es numerisch sortiert:

%Vor%

Arrays können auch umgekehrt werden. Das vorherige Beispiel fortsetzen:

%Vor%

Um eine benutzerdefinierte Sortierung bereitzustellen, können Sie das optionale Funktionsargument an array.sort() :

übergeben %Vor%

Elemente behalten ihre Position bei, wenn das Element einem anderen Element entspricht. Damit können Sie mehrere Sortieralgorithmen kombinieren. Sie müssen Ihre Sortiereinstellungen in umgekehrter Reihenfolge anwenden, da die letzte Sortierung Vorrang vor den vorherigen hat. Um das folgende Array nach der ersten Spalte (in absteigender Reihenfolge) und dann nach der zweiten Spalte (in aufsteigender Reihenfolge) zu sortieren:

%Vor%

Um lateinische Strings (d. h. Englisch, Deutsch, Niederländisch) zu sortieren, verwenden Sie String.localeCompare :

%Vor%

Um die Daten vom Objekt Date zu sortieren, verwenden Sie ihre Millisekunden-Darstellung:

%Vor%

Sie können diese Sortierfunktion auf alle Arten von Daten anwenden, folgen Sie einfach den Regeln:

x ist das Ergebnis des Vergleichs zweier Werte, die von einer an array.sort übergebenen Funktion zurückgegeben werden sollen.

  1. x < 0 : element_a sollte vor element_b stehen
  2. x = 0 : element_a und element_b sind gleich, die Elemente werden nicht getauscht
  3. x > 0 : element_a sollte nach element_b kommen
Lekensteyn 23.05.2011, 19:06
quelle
0

Ich würde vorschlagen, eine Funktion höherer Ordnung zu schreiben, die die Funktionen orderList und orderDir als Argumente verwendet und eine Komparatorfunktion zurückgibt, die direkt an Array # sort übergeben werden kann. Auf diese Weise können Sie verschiedene Implementierungen ausprobieren (zum Beispiel, um die Einfachheit der Leistung zu ersetzen).

Dieser nicht getestete Code demonstriert die Idee:

%Vor%

Beachten Sie, dass Sie bei der Verwendung von "localeCompare" vs Subtraktion für Strings vs Zahlen vorsichtig sein müssen, sodass dieser Aspekt möglicherweise auch für die getComparator-Funktion parametrisiert werden könnte.

    
maerics 23.05.2011 18:55
quelle
0
___ answer6101704 ___

Das Array-Literal %code% wird gegenüber %code% bevorzugt. Die Notation %code% ist nicht gültig und sollte %code% sein.

Muss das Rad neu erfunden werden? Zwei Arrays können miteinander verbunden werden:

%Vor%

Elemente können an das Ende angehängt werden mit:

%Vor%

Arrays haben eine Methode zum Sortieren des Arrays. Standardmäßig ist es numerisch sortiert:

%Vor%

Arrays können auch umgekehrt werden. Das vorherige Beispiel fortsetzen:

%Vor%

Um eine benutzerdefinierte Sortierung bereitzustellen, können Sie das optionale Funktionsargument an %code% :

übergeben %Vor%

Elemente behalten ihre Position bei, wenn das Element einem anderen Element entspricht. Damit können Sie mehrere Sortieralgorithmen kombinieren. Sie müssen Ihre Sortiereinstellungen in umgekehrter Reihenfolge anwenden, da die letzte Sortierung Vorrang vor den vorherigen hat. Um das folgende Array nach der ersten Spalte (in absteigender Reihenfolge) und dann nach der zweiten Spalte (in aufsteigender Reihenfolge) zu sortieren:

%Vor%

Um lateinische Strings (d. h. Englisch, Deutsch, Niederländisch) zu sortieren, verwenden Sie %code% :

%Vor%

Um die Daten vom Objekt %code% zu sortieren, verwenden Sie ihre Millisekunden-Darstellung:

%Vor%

Sie können diese Sortierfunktion auf alle Arten von Daten anwenden, folgen Sie einfach den Regeln:

%code% ist das Ergebnis des Vergleichs zweier Werte, die von einer an %code% übergebenen Funktion zurückgegeben werden sollen.

  1. %code% : %code% sollte vor %code% stehen
  2. %code% : %code% und %code% sind gleich, die Elemente werden nicht getauscht
  3. %code% : %code% sollte nach %code% kommen
___ tag123javascript ___ JavaScript (nicht zu verwechseln mit Java) ist eine dynamische Sprache mit mehreren Paradigmen auf hoher Ebene, die sowohl für das clientseitige als auch für das serverseitige Scripting verwendet wird. Verwenden Sie dieses Tag für Fragen zu ECMAScript und seinen verschiedenen Dialekten / Implementierungen (außer ActionScript und Google-Apps-Script). ___ qstnhdr ___ Wie sortiert man ein multidimensionales Array nach mehreren Spalten in JavaScript? ___ antwort6112581 ___

Basierend auf Lekensteyns exzellenter Antwort habe ich die folgende Lösung für meine Bedürfnisse entwickelt. Ich habe noch keine vollständigen QA-Tests durchgeführt und weiß nicht, ob es perfekt ist (in der Tat, ich bin mir ziemlich sicher, dass es nicht ist), aber ich hoffe, dass andere daraus Nutzen ziehen und darauf aufbauen können ihre Bedürfnisse. Ich werde ein Update veröffentlichen, wenn größere Änderungen erforderlich sind.

%Vor%     
___ tag123arrays ___ Ein Array ist eine geordnete Datenstruktur, die aus einer Sammlung von Elementen (Werten oder Variablen) besteht, die jeweils durch einen oder mehrere Indizes identifiziert werden. Wenn Sie nach bestimmten Varianten von Arrays fragen, verwenden Sie stattdessen diese verwandten Tags: [Vektor], [Arraylist], [Matrix]. Wenn Sie dieses Tag verwenden, markieren Sie die Frage auch mit der verwendeten Programmiersprache, es sei denn, Ihre Frage bezieht sich nicht auf eine bestimmte Programmiersprache. ___ tag123multidimensionarray ___ Multidimensional-Arrays können als multidimensionale Tabellen beschrieben werden. Jeder Index, der verwendet wird, um ein bestimmtes Element zu finden, wird als Dimension bezeichnet. ___ answer6101586 ___

Ich würde vorschlagen, eine Funktion höherer Ordnung zu schreiben, die die Funktionen orderList und orderDir als Argumente verwendet und eine Komparatorfunktion zurückgibt, die direkt an Array # sort übergeben werden kann. Auf diese Weise können Sie verschiedene Implementierungen ausprobieren (zum Beispiel, um die Einfachheit der Leistung zu ersetzen).

Dieser nicht getestete Code demonstriert die Idee:

%Vor%

Beachten Sie, dass Sie bei der Verwendung von "localeCompare" vs Subtraktion für Strings vs Zahlen vorsichtig sein müssen, sodass dieser Aspekt möglicherweise auch für die getComparator-Funktion parametrisiert werden könnte.

    
___ tag123sorting ___ Das Sortieren ist der Vorgang, bei dem eine Reihenfolge auf eine Objektgruppe angewendet wird. ___ qstntxt ___

Ich habe den ganzen Tag ohne eine gute Lösung an diesem Problem gearbeitet. Google war auch wenig Hilfe. Ich habe ein Skript, das ein zweidimensionales Array mit einer unbekannten Anzahl von Zeilen / Spalten akzeptieren muss. Das Skript muss außerdem ein eindimensionales Array akzeptieren, das eine Liste von Spalten enthält, nach denen sortiert werden soll, und ein anderes, das die Sortierreihenfolge enthält. Der Anruf wird ungefähr so ​​aussehen:

%Vor%

Die Funktion do2DArraySort sollte das Array dataArr nach der ersten Spalte (in aufsteigender Reihenfolge), dann nach der fünften (in absteigender Reihenfolge), dann nach der dritten (in absteigender Reihenfolge) und dann nach der zweiten (in absteigender Reihenfolge) zurückgeben ). Ich konnte es mit dem unten stehenden Code zwei Ebenen tief machen, aber es fiel auseinander, als ich versuchte, eine dritte Sortierspalte hinzuzufügen. Ich verstehe warum, aber ich kann keinen guten Weg finden, es zum Laufen zu bringen.

Gibt es eine Standardmethode, dies zu tun? Kann mir jemand ein gutes Skript online zeigen, das ich studieren und als Vorlage verwenden kann? Oder kann jemand eine Änderung an meinem Code vorschlagen, damit es funktioniert?

Danke!

%Vor%     
___
Nicholas 24.05.2011 15:04
quelle