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)
collateBy
Ich habe gerade eine ähnliche Antwort hier
geteiltIch 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.
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.
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
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)
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%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.
Tags und Links javascript arrays functional-programming reduce