Detaillierte Erklärung der Verwendung von Reduce Fold Unfold in JS

Detaillierte Erklärung der Verwendung von Reduce Fold Unfold in JS

falten (reduzieren)

Reden wir über „Reduce“. Diese Funktion gefällt mir wirklich gut. Sie spart jede Menge Code und verfügt über einige deklarative Prototypen. Einige gängige Toolfunktionen wie „Flatten“, „DeepCopy“, „MergeDeep“ usw. werden mit „Reduce“ elegant und präzise implementiert. Reduce wird auch Fold genannt. Im Wesentlichen handelt es sich dabei um den Vorgang des Faltens eines Arrays. Dabei werden mehrere Werte im Array durch Berechnung in einen Wert umgewandelt. Jede Berechnung wird von einer Funktion verarbeitet. Diese Funktion ist das Kernelement von Reduce und wird Reducer genannt. Die Reducer-Funktion ist eine zweidimensionale Funktion, die einen einzelnen Wert zurückgibt. Die übliche Additionsfunktion ist Reducer.

const addReducer = (x, y) => x + y;

Die Add-Funktion ist ein Reducer. Am häufigsten wird sie in Verbindung mit der Reduce-Methode des Arrays verwendet.

[1, 2, 3, 4, 5].reduzieren(addReducer, 0) // 15

Um Reduce besser zu verstehen, implementieren wir diese Funktion mithilfe verschiedener Ideen.

Verwenden von for...of

const reduzieren = (f, init, arr) => {
  sei acc = init;
  für (const item of arr) {
    acc = f(ac, Artikel);
  }
  Rückgabe-Ac
}
// Führen Sie „reduceFor(addReducer, 0, [1, 2, 3, 4, 5])“ aus. // 15

Verwenden einer while-Schleife

reduzieren = (f, init, arr) => {
  sei acc = init;
  Strom lassen;
  sei i = 0;
  während ((aktuell = arr[i++])) {
    acc = f(ac, aktuell);
  }
  Rückgabe gem.
}

// Führen Sie „reduceFor(addReducer, 0, [1, 2, 3, 4, 5])“ aus. // 15

Eher wie eine Fold-Implementierung

Die obige Implementierung ist leicht zu verstehen, scheint aber den Faltvorgang nicht widerzuspiegeln. Das Falten sollte ein schichtweiser Komprimierungsvorgang des Arrays sein. Die obige Implementierung trennt tatsächlich das Array und die Logik und führt außerdem mehr Zwischenvariablen ein, obwohl es intern keine Nebenwirkungen gibt.
Wenn Sie aus einer anderen Perspektive darüber nachdenken, können Sie den Faltprozess tatsächlich besser widerspiegeln, wenn Sie den Status über Parameter übergeben. Die Parameter hier sind Werte, die sich auf sich allmählich ändernde Arrays und berechnete Werte beziehen, und Sie können sie so zustandslos wie möglich machen. Die Implementierung einer wirklich reinen Funktion hat keine Ausdrücke, sondern nur Anweisungen, was durch Rekursion erreicht werden kann. Die folgende Implementierung verwendet Endrekursion, um Reduce zu implementieren. Sie können sehen, wie sich das Array und die berechneten Werte während des Implementierungsprozesses ändern. Es passt sehr gut zur Namensfalte

Funktion reduzieren(f, init, arr) {
  wenn (arr.length === 0) return init;
  const [Kopf, ...Rest] = arr;
  returniere ReduceRecursion(f, f(init, head), rest);
}

// Führen Sie „reduceFor(addReducer, 0, [1, 2, 3, 4, 5])“ aus. // 15

entfalten

Das Gegenteil von fold ist unfold. Wie der Name schon sagt, generiert unfold eine Reihe von Werten basierend auf einem umgekehrten Reducer. Wenn an diesem Punkt die ursprüngliche Reducer-Implementierung ähnlich wie (a, b) -> c ist, dann ist das Gegenteil c -> [a, b]. Das Generieren einer Sequenz ist eine sehr grundlegende Operation, aber selbst diese grundlegende Operation hat viele Implementierungsideen. Bevor wir Unfold vorstellen, schauen wir uns andere Möglichkeiten zur Implementierung von Sequenzen an und ziehen dann einen Vergleich.

Sequenzimplementierung

Bereich (0, 100, 5)

Erwartete Ergebnisse

[0, 5, 10, ... 95]

Array-Implementierung

Dazu verrate ich nicht viel, das sollte jeder wissen.

Bereich = (erster, letzter, Schritt) => {
  const n = (letzter - erster) / Schritt + 1;
  gibt Array.from({ Länge: n - 1 }) zurück
            .map((_, index) => erster + index * Schritt);
}
// Sie können auch den zweiten Parameter von from verwenden // Array.from({ length: n }, (_, i) => first + i * step);

Generatorimplementierung

Es gibt ein weiteres leistungsfähiges Tool zum Generieren von Sequenzen, nämlich den Generator, der zum Generieren von Daten verwendet wird. Der Generator gibt einen Iterator zurück, der ebenfalls problemlos Sequenzen erzeugen kann

Funktion*Bereich(erster, letzter, Schritt) {
  sei acc = zuerst;
  während (account < last) {
    Rendite gem.
    beschl. = beschl. + Schritt;
  }
}
[...Bereich(0, 100, 5)]

Im Vergleich dazu konzentriert sich der Generator mehr auf den Generierungsprozess, während Array sich auf den Datenänderungsprozess konzentriert.

Umsetzung entfalten

Bevor wir Unfold implementieren, klären wir zunächst die Implementierungsideen. Wie Fold verwendet es auch Rekursion, und die entsprechenden Datenänderungen müssen während des Implementierungsprozesses sichtbar sein. Der allgemeine Ablauf ist wie folgt

0 -> [0, 5]

5 -> [5, 10]

10 -> [10, 15]

15 -> [15, 20]

...

90 -> [90, 95]

95 -> [95, 100]

Es ist ersichtlich, dass der Vorgang genau das Gegenteil von fold ist, was c -> [a, b] entspricht. Da der Anfangswert ein Array sein muss, benötigt unfold nur zwei Parameter, was wie folgt implementiert wird.

Funktion entfalten(f, init) {
  const g = (f, nächstes, acc) => {
    const Ergebnis = f(nächstes);
    const [Kopf, letzter] = Ergebnis || [];
    console.log(letztes);
    Ergebnis zurückgeben? g(f, letztes, acc.concat(Kopf)) : acc;
  };
  g(f, init, []) zurückgeben;
}

Bereich = R.curry((erster, letzter, Schritt) =>
  entfalten(nächstes => nächstes < letztes und [nächstes, nächstes + Schritt], 0)
)

//Bereich (0, 100, 5) ausführen

Zusammenfassen

Das Obige ist eine kurze Einführung in Fold und Unfold, zwei sehr wichtige Konzepte in der FP-Programmierung, kombiniert mit Reduce und einem Beispiel für die Generierung einer Sequenz. Natürlich dienen ihre Funktionen nicht nur zur Generierung von Sequenzen, sondern verfügen auch über viele leistungsstarke Funktionen.

Oben finden Sie eine ausführliche Erläuterung der Verwendung von Reduce Fold Unfold in JS. Weitere Informationen zu JS finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Zusammenfassung zur Verwendung der Reduce()-Methode in JS
  • js verwendet die Reduce-Methode, um Ihren Code eleganter zu gestalten
  • Syntax und Beispielanalyse der JavaScript-Array-Methode „reduce()“
  • Grundlegende Verwendung von Javascript-Array-Includes und -Reduces
  • Detaillierte Erklärung der Unterschiede zwischen JS-Arrays „Finden“, „Some“, „Filtern“ und „Reduzieren“
  • 25 erweiterte Verwendungsmöglichkeiten von JS Array Reduce, die Sie kennen müssen
  • JS verwendet die Methode „reduce()“, um Baumstrukturdaten zu verarbeiten
  • Detaillierte Erklärung von JavaScript Reduce
  • Detaillierte Erklärung des JavaScript Array.reduce-Quellcodes
  • 8 JS reduziert Verwendungsbeispiele und reduzierte Betriebsmethoden

<<:  So überprüfen Sie, ob der Grafiktreiber erfolgreich in Ubuntu installiert wurde

>>:  Tutorial zur Migration von MySQL von phpstudy nach Linux

Artikel empfehlen

VPS erstellt Offline-Download-Server (nach der Ära der Netzwerkfestplatten)

Motivation Aus Lerngründen habe ich einen VPS-Die...

HTML-Tutorial: Sortierte Listen

<br />Originaltext: http://andymao.com/andy/...

WeChat-Applet implementiert Suchfunktion und springt zur Suchergebnisseite

Suchseite: search.wxml-Seite: <view class=&quo...

Verwenden Sie js, um js-Funktionen in Iframe-Seiten aufzurufen

In letzter Zeit habe ich jeden Tag an meinen Absch...

Analyse der gemeinsamen Indexfunktion von MySQL und Anwendungsbeispiele

Dieser Artikel veranschaulicht anhand von Beispie...

MySQL 5.6.23 Installations- und Konfigurations-Umgebungsvariablen-Tutorial

In diesem Artikel finden Sie das Installations- u...

So passen Sie Docker-Images mit Dockerfile an

Anpassen von Bildern mit Dockerfile Unter Bildanp...

Die umfassendste Sammlung von Front-End-Interviewfragen

HTML und CSS 1. Verständnis und Kenntnisse von WE...

Nginx-Überwachungsprobleme unter Linux

Nginx-Installation Stellen Sie sicher, dass die v...

Grafisches Tutorial zur Installation und Konfiguration von MySQL 8.0.11 (Win10)

In diesem Artikel werden die Installations- und K...

Beste Tools zum Erstellen und Bearbeiten von Screenshots unter Linux

Als ich mein primäres Betriebssystem von Windows ...