折りたたむ(減らす)では、reduce についてお話しましょう。私はこの関数がとても気に入っています。この関数は、多くのコードを節約し、宣言的なプロトタイプをいくつか備えています。flatten、deepCopy、mergeDeep などの一般的なツール関数は、reduce を使用してエレガントかつ簡潔に実装されています。 Reduceはfoldとも呼ばれます。基本的には配列を折りたたむプロセスです。計算によって配列内の複数の値を1つの値に変換します。各計算は関数によって処理されます。この関数はreducerと呼ばれるreduceのコア要素です。reducer関数は、単一の値を返す2次元関数です。一般的なadd関数はreducerです。 const addReducer = (x, y) => x + y; add 関数はリデューサーです。最も一般的な使用法は、配列の Reduce メソッドと組み合わせて使用することです。 [1, 2, 3, 4, 5].reduce(addReducer, 0) // 15 Reduce をよりよく理解するために、さまざまなアイデアを使用してこの関数を実装してみましょう。 for...of の使用定数reduce = (f, init, arr) => { acc = init; とします。 for (arrのconst項目) { acc = f(acc, アイテム); } 返品 } // 実行reduceFor(addReducer, 0, [1, 2, 3, 4, 5]) // 15 whileループの使用減らす = (f, init, arr) => { acc = init; とします。 電流を流す; i = 0 とします。 while ((current = arr[i++])) { acc = f(acc, 現在の値); } acc を返します。 } // 実行reduceFor(addReducer, 0, [1, 2, 3, 4, 5]) // 15 折り畳み実装に近い上記の実装は理解しやすいですが、折り畳みプロセスを反映していないようです。折り畳みは、配列をレイヤーごとに圧縮する操作である必要があります。上記の実装では、実際には配列とロジックが分離され、内部的には副作用はありませんが、中間変数もさらに導入されています。 関数reduce(f, init, arr) { (arr.length === 0) の場合は init を返します。 const [head, ...rest] = arr; 戻り値:reduceRecursion(f, f(init, head), rest); } // 実行reduceFor(addReducer, 0, [1, 2, 3, 4, 5]) // 15 展開するfold の逆は unfold です。名前が示すように、unfold は逆リデューサーに基づいて一連の値を生成します。この時点で、元のリデューサーの実装が (a, b) -> c に似ている場合、その逆は c -> [a, b] になります。シーケンスの生成は非常に基本的な操作ですが、この基本的な操作にも多くの実装のアイデアがあります。unfold を紹介する前に、シーケンスを実装する他の方法を見て比較してみましょう。 シーケンスの実装 範囲(0, 100, 5) 期待される結果
配列の実装これについてはあまり言いませんが、誰もが知っているはずです。 範囲 = (最初、最後、ステップ) => { 定数 n = (最後 - 最初) / ステップ + 1; Array.from({ 長さ: n - 1 }) を返します .map((_, index) => 最初 + インデックス * ステップ); } // from の 2 番目のパラメータを使用することもできます // Array.from({ length: n }, (_, i) => first + i * step); ジェネレータの実装シーケンスを生成するためのもう 1 つの強力なツールとして、データを生成するために使用されるジェネレーターがあります。ジェネレータはイテレータを返す。これも簡単にシーケンスを生成することができる。 関数*範囲(最初、最後、ステップ) { acc = first とします。 while (acc < last) { 収益 acc; acc = acc + ステップ; } } [...範囲(0, 100, 5)] これら 2 つを比較すると、ジェネレーターは生成プロセスに重点を置いているのに対し、配列はデータ変更プロセスに重点を置いています。 実装を展開するunfold を実装する前に、まず実装のアイデアを整理しましょう。fold と同様に、これも再帰を使用し、実装プロセス中に対応するデータの変更を確認する必要があります。一般的なプロセスは次のとおりです。
このプロセスは、c -> [a, b] に準拠する fold の逆であることがわかります。初期値は配列である必要があるため、unfold には 2 つのパラメーターのみが必要であり、次のように実装されます。 関数展開(f, init) { 定数 g = (f, next, acc) => { 定数結果 = f(next); const [head, last] = 結果 || []; コンソールログ(最後); 結果を返します? g(f, last, acc.concat(head)): acc; }; g(f, init, []) を返します。 } 範囲 = R.curry((最初、最後、ステップ) => 展開(次 => 次 < 最後 && [次, 次 + ステップ], 0) ) // 範囲(0, 100, 5)を実行する 要約する上記は、FP プログラミングにおける非常に重要な 2 つの概念である fold と unfold の簡単な紹介であり、reduce と組み合わせてシーケンスを生成する例です。もちろん、これらの機能はシーケンスを生成するだけでなく、多くの強力な機能も備えています。 以上がJSにおけるreduce fold unfoldの使い方の詳しい説明です。JSについてさらに詳しく知りたい方は、123WORDPRESS.COMの関連記事もぜひご覧ください! 以下もご興味があるかもしれません:
|
<<: Ubuntu にグラフィック ドライバーが正常にインストールされたかどうかを確認する方法
>>: phpstudy から Linux への MySQL の移行に関するチュートリアル
MySQL 5.5 のインストールと構成のチュートリアル ノートを整理し、全員と共有します。 1.公...
1. asキーワードはアサーションを示すTypescript では、アサーションを表現する方法が 2...
Centos7 と Centos6 では、GRUB パスワードの設定手順に大きな違いがあります。これ...
Tomcat は Web コンテナとして広く知られています。Java を学び始めたときから現在の仕事...
npx 使用チュートリアル今晩、 Vue-Cli勉強していたところ、ふと最新の@4.xxバージョンを...
概要バックアップは災害復旧の基礎であり、システム操作エラーやシステム障害によるデータ損失を防ぐために...
Gird レイアウトは Flex レイアウトといくつかの類似点があり、どちらもコンテナーの内部項目を...
序文SQL の言語分類には主に以下の種類があります。 DDLデータ定義言語作成、削除、変更データ定義...
MySQL テーブルのテーブル構造をすばやく変更する - 「MySQL 管理」から抜粋 ALTER ...
解決: pythearn2 パッケージをダウンロードしたディレクトリで、setup.py ファイルを...
注意:この記事は現在取り組んでいる nestjs+graphql+serverless 合宿における...
目次1. まずMySQLサーバーを停止する2. MySQLサーバーをアンインストールする3. MyS...
フラットなウェブサイト構造の本質はシンプルさです。コンテンツの重要なポイントを強調し、ページの装飾効...
0. 背景ハードウェア: Xiaomi Notebook Air 13/Inter Core i7-...
目次1. グローバルガード1.1 グローバルフロントガード1.2 グローバルポストルートガード1.3...