Ramda Style Thinking: Unveränderlichkeit und Arrays

1. Erste Schritte
2. Kombinieren Sie die Funktionen
3. Teilweise Verwendung (Currying)
4. Deklarative Programmierung
5. Grundlegende Notation
6. Unveränderlichkeit und Gegenstände
7. Unveränderlichkeit und Arrays
8. Objektive
9. Fazit


Dieser Beitrag ist der siebte Teil einer Reihe von Artikeln zur funktionalen Programmierung mit dem Titel Ramda Style Thinking.


Im sechsten Teil haben wir über die Arbeit mit JavaScript-Objekten in einem funktionalen und unveränderlichen Stil gesprochen.


In diesem Beitrag werden wir über ähnliche Arbeiten mit Arrays sprechen.


Array-Elemente lesen


Im sechsten Teil haben wir die verschiedenen Ramda-Funktionen zum Lesen von Eigenschaften von Objekten wie prop , pick und Has kennengelernt. Ramda hat noch mehr Methoden zum Lesen von Array-Elementen.


Das Äquivalent von prop für ein Array ist n-te ; Das Äquivalent für pick ist Slice und das Äquivalent für has is enthält . Schauen wir sie uns an.


 const numbers = [10, 20, 30, 40, 50, 60] nth(3, numbers) // => 40 (  ) nth(-2, numbers) // => 50 (     ) slice(2, 5, numbers) // => [30, 40, 50] (. ) contains(20, numbers) // => true 

Slice verwendet zwei Indizes und gibt ein Subarray zurück, das am ersten Index beginnt (beginnend bei Null) und alle Elemente bis zum zweiten Index enthält, jedoch nicht das Element dieses Index.


Der Zugriff auf das erste und letzte Element eines Arrays ist ziemlich häufig, daher bietet Ramda kurze Funktionen für diese Fälle, head und last . Es bietet auch Funktionen zum Abrufen aller Elemente außer dem ersten (Ende), allen außer dem letzten ( Init ), den ersten N Elementen ( take (N) ) und den letzten N Elementen ( takeLast (N) ). Schauen wir sie uns in Aktion an.


 const numbers = [10, 20, 30, 40, 50, 60] head(numbers) // => 10 tail(numbers) // => [20, 30, 40, 50, 60] last(numbers) // => 60 init(numbers) // => [10, 20, 30, 40, 50] take(3, numbers) // => [10, 20, 30] takeLast(3, numbers) // => [40, 50, 60] 

Hinzufügen, Aktualisieren und Löschen von Array-Elementen


Beim Studium der Arbeit mit Objekten lernten wir die Funktionen assoc , dissoc und dissoc zum Hinzufügen, Aktualisieren und Löschen von Eigenschaften.


Da Arrays eine geordnete Datenstruktur haben, haben wir mehrere Methoden, die dieselbe Aufgabe wie assoc für Objekte assoc . Am häufigsten werden Einfügungen und Aktualisierungen vorgenommen . Ramda bietet jedoch auch Methoden zum Anhängen und Voranstellen für typische Fälle, in denen Elemente am Anfang und Ende eines Arrays hinzugefügt werden. insert , append und prepend Sie dem Array neue Elemente hinzu. update "ersetzt" ein bestimmtes Element im Array durch einen neuen Wert.


Wie Sie es von einer Funktionsbibliothek erwarten können, geben alle diese Funktionen ein neues Array mit den erwarteten Änderungen zurück. Das ursprüngliche Array ändert sich nie.


 const numbers = [10, 20, 30, 40, 50, 60] insert(3, 35, numbers) // => [10, 20, 30, 35, 40, 50, 60] append(70, numbers) // => [10, 20, 30, 40, 50, 60, 70] prepend(0, numbers) // => [0, 10, 20, 30, 40, 50, 60] update(1, 15, numbers) // => [10, 15, 30, 40, 50, 60] 

Um zwei Objekte zu einem zu kombinieren, haben wir zuvor die merge kennengelernt. Ramda bietet auch eine Concat- Methode, um dieselbe Operation mit Arrays auszuführen.


 const numbers = [10, 20, 30, 40, 50, 60] concat(numbers, [70, 80, 90]) // => [10, 20, 30, 40, 50, 60, 70, 80, 90] 

Beachten Sie, dass das zweite Array dem ersten beigetreten ist. Dies erscheint logisch, wenn diese Methode getrennt von anderem Code verwendet wird. Wie beim merge führt diese Logik jedoch möglicherweise nicht zu genau dem, was wir erwarten würden, wenn wir diese Methode in unserer Pipeline verwenden. Ich fand es nützlich, eine concatAfter zu schreiben, concatAfter : const concatAfter = flip(concat) , um sie in meinen Pipelines zu verwenden.


Ramda bietet auch verschiedene Optionen zum Löschen von Elementen. Entfernen entfernt Elemente anhand ihres Index, ohne sie durch ihren Wert zu entfernen. Es gibt auch Methoden wie drop und dropLast für typische Fälle, in denen Elemente vom Anfang oder Ende eines Arrays entfernt werden.


 const numbers = [10, 20, 30, 40, 50, 60] remove(2, 3, numbers) // => [10, 20, 60] without([30, 40, 50], numbers) // => [10, 20, 60] drop(3, numbers) // => [40, 50, 60] dropLast(3, numbers) // => [10, 20, 30] 

Beachten Sie, dass remove einen Index und einen Betrag akzeptiert, während slice zwei Indizes akzeptiert. Diese Inkonsistenz kann verwirrend sein, wenn Sie nichts davon wissen.


Elementkonvertierung


Wie bei Objekten möchten wir möglicherweise das Array-Element aktualisieren, indem wir die Funktion auf den ursprünglichen Wert anwenden.


 const numbers = [10, 20, 30, 40, 50, 60] //      10 update(2, multiply(10, nth(2, numbers)), numbers) // => [10, 20, 300, 40, 50, 60] 

Um diesen typischen Fall zu vereinfachen, bietet Ramda eine Anpassungsmethode , die wie das evolve für Objekte funktioniert. Im Gegensatz zu " evolve funktioniert " adjust nur mit einem Element des Arrays.


 const numbers = [10, 20, 30, 40, 50, 60] //      10 adjust(multiply(10), 2, numbers) 

Beachten Sie, dass die ersten beiden Argumente, die adjust , beim Vergleich mit der update umgekehrt sind. Dies kann eine Fehlerquelle sein, ist jedoch sinnvoll, wenn Sie eine Teilanwendung in Betracht ziehen. Möglicherweise möchten Sie selbst adjust(multiply(10)) und anschließend entscheiden, welchen Index des Arrays Sie damit ändern möchten.


Fazit


Jetzt haben wir Werkzeuge zum Arbeiten mit Arrays und Objekten in einem deklarativen und unveränderlichen Stil. Auf diese Weise können wir Programme erstellen, die aus kleinen, funktionalen Bausteinen bestehen, Funktionen kombinieren, die das tun, was wir brauchen, und dies alles, ohne alle unsere Datenstrukturen zu ändern.


Weiter


Wir haben gelernt, wie man Eigenschaften von Objekten und Elementen von Arrays liest, aktualisiert und transformiert. Ramda bietet andere grundlegende Werkzeuge für die Durchführung dieser Operationen, Linsen. Der nächste Objektivartikel zeigt uns, wie sie funktionieren.

Source: https://habr.com/ru/post/de415025/


All Articles