JS の compose 関数と pipe 関数の使い方の詳細な説明

JS の compose 関数と pipe 関数の使い方の詳細な説明

作成機能

compose 関数は、ネストされた順序で実行する必要がある関数をフラット化できます。ネストされた実行とは、1 つの関数の戻り値が別の関数のパラメーターとして使用されることを意味します。簡単な要件を考えてみましょう。この要件は非常に単純なので、計算関数で次のように実行できます。

定数計算 = x => (x + 10) * 10;
res = calculate(10);とします。
コンソール.log(res); // 200

しかし、前に説明した関数型プログラミングによれば、複雑なステップをいくつかの単純で再利用可能なステップに分解できるので、加算関数と乗算関数を分離しました。

定数を追加します = x => x + 10;
定数乗算 = x => x * 10;

// 計算は 2 つの関数のネストされた計算に変更され、add 関数の戻り値は multiply 関数のパラメーターとして使用されます。let res = multiply(add(10));
console.log(res); // 結果は依然として200です

上記の計算方法は関数のネストされた実行であり、私たちの compose の役割は、ネストされた実行メソッドをパラメーターとしてフラット化することです。ネストされた実行が発生すると、内部のメソッド、つまり右側のメソッドが最初に実行され、次に左側に戻ります。私たちの compose メソッドも右側のパラメーターから開始されるため、目標は非常に明確です。次のような compose メソッドが必要です。

// パラメータは右から左に実行されるため、multiply が最初に実行され、add が最後に実行されます。let res = compose(multiply, add)(10);

これについて話す前に、使用する必要がある関数を見てみましょう: Array.prototype.reduce

配列プロトタイプの削減

配列のreduceメソッドは累積効果を実現できます。このメソッドは2つのパラメータを受け取ります。1つ目は累積メソッド、2つ目は初期化値です。アキュムレータは 4 つのパラメータを受け取ります。最初のパラメータは最後に計算された値で、2 番目のパラメータは配列の現在の値です。主にこの 2 つのパラメータが使用されます。最後の 2 つのパラメータは一般的には使用されません。これらは現在のインデックスと現在の反復の配列です。

定数arr = [[1, 2], [3, 4], [5, 6]];
// prevRes の初期値は渡された [] であり、各反復後に計算された値になります。const flatArr = arr.reduce((prevRes, item) => prevRes.concat(item), []);

console.log(flatArr); // [1, 2, 3, 4, 5, 6]

Array.prototype.reduceRight

Array.prototype.reduce は左から右に反復処理します。右から左に反復処理する必要がある場合は、Array.prototype.reduceRight を使用します。

定数arr = [[1, 2], [3, 4], [5, 6]];
// prevRes の初期値は渡された [] であり、各反復後に計算された値になります。const flatArr = arr.reduceRight((prevRes, item) => prevRes.concat(item), []);

console.log(flatArr); // [5, 6, 3, 4, 1, 2]

では、この compose メソッドをどのように実装するのでしょうか? Array.prototype.reduceRight を使用する必要があります。

const compose = 関数(){
  // 受信したパラメータを配列に格納します。args == [乗算、加算]
  const args = [].slice.apply(引数);
  関数(x)を返す{
    args.reduceRight((res, cb) => cb(res), x) を返します。
  }
}

// このメソッドを検証してみましょう let calculate = compose(multiply, add);
res = calculate(10);とします。
console.log(res); // 結果は依然として200です

上記の compose 関数は、ES6 を使用するとより簡潔になります。

const compose = (...args) => x => args.reduceRight((res, cb) => cb(res), x);

Redux のミドルウェアは compose を使用して実装されており、webpack の loader の読み込み順序も compose を使用して実装されているため、右から左になります。

パイプ関数

パイプ関数はcompose関数と同じで、パラメータもフラットに配置されますが、順序は左から右になります。実装してみましょう。reduceRight を Reduce に変更するだけです。

const パイプ = 関数(){
  const args = [].slice.apply(引数);
  関数(x)を返す{
    args.reduce((res, cb) => cb(res), x) を返します。
  }
}

// パラメータの順序を左から右に変更します。let calculate = pipe(add, multiply);
res = calculate(10);とします。
console.log(res); // 結果は依然として200です

ES6 ライティング:

const パイプ = (...args) => x => args.reduce((res, cb) => cb(res), x)

以上がJSにおけるcompose関数とpipe関数の使い方の詳しい説明です。JSについてさらに詳しく知りたい方は、123WORDPRESS.COM内の他の関連記事もぜひご注目ください!

以下もご興味があるかもしれません:
  • Node.jsパイプはソースコード解析を実装します
  • Node.jsのストリームとパイプのメカニズムの原理と実装を理解する
  • JavaScript Reduceの詳しい説明
  • JavaScript Array.reduce ソースコードの詳細な説明
  • JavaScript における Reduce() の 5 つの基本的な使用例
  • JS配列reduce()メソッドの原理と使い方の分析
  • JS配列Reduceメソッドの機能と使い方の詳しい説明
  • JS配列メソッドreduceの使用例の分析
  • JavaScript の Reduce と ReduceRight の説明

<<:  Linux システムで MySQL データベースの解凍バージョンをインストールして構成する方法

>>:  MySQLのslave_exec_modeパラメータの詳細な説明

推薦する

シンプルなリスト機能を実装するミニプログラム

この記事の例では、参考のために簡単なリスト機能を実装するアプレットの具体的なコードを共有しています。...

CSS で子 div の高さを親コンテナの残りのスペースに合わせる方法

1. フローティング方式を使用する効果画像: コードは次のとおりです: (.content の高さは...

MySQL移行計画と落とし穴の実践記録

目次背景解決策1: 古いデータをバックアップするオプション2: テーブルを分割する解決策3: tid...

Linux サーバーのスクリプトを自動的にバックアップする方法 (mysql、添付ファイルのバックアップ)

1.backup.shスクリプトファイルを作成する #!/bin/sh ソースフォルダ=/データ ...

Win10にnginxをインストールする方法

会社から、負荷を実装するためにnginxをベースにFordプロジェクトのWebServiceサーバー...

MySQLに絵文字表現を挿入する方法

序文今日、オープンソース プロジェクトのフィードバック フォームを設計していたところ、絵文字表現を挿...

Linux ネットワークプログラミング機能の簡単な分析

目次1.ソケットを作成する2. ソケットをバインドする3. 聞き手を作る。聞く4. 接続が受け入れら...

Docker Compose で利用可能な環境変数の詳細な説明

Compose のいくつかの部分は、何らかの方法で環境変数を扱います。このチュートリアルは、必要な情...

Nginx バージョンのスムーズなアップグレードソリューションの詳細説明

目次背景: Nginx スムーズ アップグレード ソリューションフォールバック手順要約する背景:負荷...

Linux 仮想メモリ設定のチュートリアルと実践

仮想メモリとは何ですか?まずはWikipediaからの紹介文をそのまま引用します。仮想メモリは、コン...

iostat を使用して Linux ハードディスクの IO パフォーマンスを表示する方法

TOP 観察: IO 待機に占められる CPU 時間の割合。30% を超えると、IO の負荷が高くな...

MySQL CHARとVARCHARの選択方法

目次VARCHAR 型と CHAR 型結論: VARCHAR 型と CHAR 型VARCHAR と ...

MySQL 自動インクリメント ID のオーバーサイズ問題のトラブルシューティングと解決策

導入Xiao A がコードを書いていたところ、DBA Xiao B が突然、「急いでユーザー固有情報...

MySQLリモートアクセスの設定方法をステップバイステップで説明します

序文MySQL データベースを使用する場合、クライアントはデータベース サーバーにリクエストを送信す...

VMware 仮想マシン (CentOS7 イメージ) を使用して Linux をインストールする

1. VMwareのダウンロードとインストールリンク: https://www.jb51.net/s...