Teilen Sie das Array mithilfe von funktionalem JavaScript in zwei verschiedene Arrays auf

8

Ich habe mich gefragt, was der beste Weg wäre, ein Array mit JavaScript in zwei verschiedene Arrays aufzuteilen, aber im Rahmen der funktionalen Programmierung.

Nehmen wir an, dass die zwei Arrays in Abhängigkeit von einer Logik erstellt werden sollten. Zum Beispiel sollte das Teilen eines Arrays nur Strings mit weniger als vier Zeichen und der Rest den Rest enthalten.

%Vor%

Ich habe über verschiedene Methoden nachgedacht:

Filter :

%Vor%

Das Problem dabei ist, dass Sie Ihre Daten zweimal durchlesen müssen, aber es ist sehr gut lesbar. Wäre es eine massive Auswirkung, dies zweimal zu tun, wenn Sie ein ziemlich großes Array haben?

Reduzieren :

%Vor%

Wobei der Index 0 des Arrays das Array von weniger als vier und der Index 1 das Array aus mehr als drei enthält.

Ich mag das nicht zu sehr, weil es so aussieht, als würde die Datenstruktur ein bisschen Probleme bereiten, da es sich um ein Array von Arrays handelt. Ich habe darüber nachgedacht, ein Objekt mit dem Reduzieren zu erstellen, aber ich kann mir nicht vorstellen, dass es besser wäre als das Array innerhalb einer Array-Lösung.

Ich habe es geschafft, ähnliche Fragen online und Stack Overflow zu sehen, aber viele von ihnen brechen die Idee der Unveränderlichkeit mit push() oder sie haben sehr unlesbare Implementierungen, was meiner Meinung nach die Ausdruckskraft der funktionalen Programmierung bricht .

Gibt es andere Möglichkeiten, dies zu tun? (funktional natürlich)

    
worker11811 09.08.2016, 21:20
quelle

5 Antworten

5

collateBy

Ich habe gerade eine ähnliche Antwort hier

geteilt

Ich mag diese Lösung besser, weil sie die Kollatierung abstrahiert, aber Sie können steuern, wie Elemente mithilfe einer Funktion höherer Ordnung sortiert werden.

Beachten Sie, dass wir nichts über animal.length oder < 4 oder animals[0].push innerhalb collateBy sagen. Diese Prozedur hat keine Kenntnis von der Art von Daten, die Sie möglicherweise zusammenstellen.

%Vor%

Schauen Sie sich andere Antworten an, die ich gepostet habe , um andere Nutzungsvarianten zu sehen. Es ist eine ziemlich handliche Prozedur.

bifilter

Dies ist eine andere Lösung, die beide Ausgänge einer Filterfunktion erfasst, anstatt gefilterte Werte wegzuwerfen, wie Array.prototype.filter tut.

Dies ist im Grunde das, was Ihre reduce Implementierung tut, aber es wird in eine generische, parametrisierte Prozedur abstrahiert. Es verwendet nicht Array.prototype.push , aber im Körper eines Verschlusses wird lokalisierte Mutation allgemein als OK akzeptiert.

%Vor%

Obwohl es etwas einfacher ist, ist es nicht annähernd so mächtig wie collateBy . Wie auch immer, wählen Sie das, was Sie wollen, passen Sie es an Ihre Bedürfnisse an und haben Sie Spaß!

Wenn dies Ihre eigene App ist, gehen Sie auf Nummer sicher und fügen Sie sie zu Array.prototype

hinzu %Vor%     
user633183 10.08.2016, 03:32
quelle
8

Die Funktion, die Sie erstellen möchten, wird normalerweise als partition bezeichnet und kann unter diesem Namen in vielen Bibliotheken gefunden werden, z. B. underscore.js . (Soweit ich weiß, ist es keine eingebaute Methode)

%Vor%
  

Ich mag das nicht zu sehr, weil es so aussieht, als würde die Datenstruktur einige Probleme bereiten, da es sich um ein Array von Arrays handelt

Nun, das ist der einzige Weg, eine Funktion in Javascript zu haben, die zwei verschiedene Werte zurückgibt. Es sieht etwas besser aus, wenn Sie die Destrukturierungsaufgabe (ein ES6 Funktion):

%Vor%

Betrachten Sie es als Rückgabe eines Arrays, anstatt ein Array von Arrays zurückzugeben. "Array of Arrays" weist darauf hin, dass Sie möglicherweise eine variable Anzahl von Arrays haben.

  

Ich habe es geschafft, ähnliche Fragen online und Stack Overflow zu sehen, aber viele von ihnen brechen die Idee der Unveränderlichkeit mit push () oder sie haben sehr unlesbare Implementierungen, was meiner Meinung nach die Ausdruckskraft der funktionalen Programmierung sprengt .

Mutabilität ist kein Problem, wenn Sie es in einer einzigen Funktion lokalisieren. Von außen ist es genauso unwandelbar wie zuvor und manchmal wird man mit etwas Veränderlichkeit idiomatischer sein, als alles rein funktionell zu tun. Wenn ich eine Partitionsfunktion von Grund auf neu programmieren müsste, würde ich etwas in diese Richtung schreiben:

%Vor%     
hugomg 09.08.2016 21:52
quelle
2

Wenn Sie die Verwendung von Unterstrichen nicht ablehnen, gibt es eine nette kleine Funktion namens groupBy , die genau das tut, wonach Sie suchen:

%Vor%     
Hopeless 09.08.2016 21:39
quelle
2

Eine kürzere .reduce() Version wäre:

%Vor%

Was könnte mit Destrukturierung kombiniert werden:

%Vor%     
Arnauld 09.08.2016 22:19
quelle
-1

Ich glaube nicht, dass es eine andere Lösung geben könnte, als ein Array von Arrays oder ein Objekt mit Arrays zurückzugeben. Wie sonst gibt eine JavaScript-Funktion mehrere Arrays zurück, nachdem sie aufgeteilt wurden?

Schreiben Sie eine Funktion, die Ihre Push-Logik für die Lesbarkeit enthält.

%Vor%
    
Ozan 09.08.2016 21:58
quelle