ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScriptでreduceメソッドを使う方法

JavaScriptでreduceメソッドを使う方法

醉折花枝作酒筹
醉折花枝作酒筹オリジナル
2021-06-10 13:47:532844ブラウズ

JavaScript では、reduce はマージメソッドであり、構文形式は「array.reduce(function(前回の値, 現在の値, インデックス, 配列オブジェクト){}, 初期値)」となります。 Reduce メソッドは関数をアキュムレータとして受け取り、配列内の各値が 1 つの値に減らされます。

このチュートリアルの動作環境: Windows7 システム、JavaScript バージョン 1.8.5、Dell G3 コンピューター。

前の 2 つの記事の反復メソッド (map() の実装、filter() の実装) とは異なり、reduce() はマージ メソッドです。

reduce は 2 つのパラメータを受け取ります:

最初のパラメータは、各項目に対して呼び出される関数です。

この関数は 4 つのパラメータを受け取ります:

  • 前の値 prev

  • 現在の値 cur

  • 項目のインデックス インデックス

  • Array オブジェクト array

2 番目のオプションのパラメータは、次の基礎として使用されます。マージ 初期値

reduceメソッドは最終値を返します。

コード表現:

arr.reduce(function(prev, cur, index, arr){}, initialValue)

Merge

前の反復とは異なり、マージは各項目のターゲット関数を実行しませんが、次の 2 つのステップに要約できます。 :

  • 配列の最初の 2 つの項目を継続的に「取り出し」、それらに対してターゲット関数を実行し、戻り値を計算します

  • 上記戻り値を配列の先頭に「埋め戻す」新しい配列[0]

  • 配列内の各項目にアクセスするまでこの処理をループで実行し続ける1 回

  • 最終結果を返す

#例

配列 [1, 2, 3] のマージ実行 (prev, cur) => prev cur、プロセス 図に示すように:

[1, 2, 3] // 取出 1 + 2 ,填回 3
[3, 3] // 取出 3 + 3 ,填回 6
[6] // 最终结果为 6

したがって、6 が得られます。

実装

最初のバージョン

このアイデアによると、コードの最初のバージョンは次のとおりです

// 第一版
Array.prototype.fakeReduce = function fakeReduce(fn, base) {
  // let arr = base ? this.unshift(base) : this;// 首进,返回新数组的长度,影响原数组 故不能这么写
  let initialArr = this;
  let arr = initialArr.concat(); //得到副本

  if (base) arr.unshift(base); // 当存在归并基础值的参数时,将其从数组首部推入
  let index;

  while (arr.length > 2) {
    index = initialArr.length - arr.length + 1;
    let newValue = fn.call(null, arr[0], arr[1], index, initialArr);
    arr.splice(0, 2); // 删除前两项,影响原数组
    arr.unshift(newValue);// 把 fn(arr[0],arr[1]) 的结果从数组首部推入
  }
  index += 1;
  let result = fn.call(null, arr[0], arr[1], index, initialArr);
  return result;
};

注:


Queue メソッド unshift()

配列の先頭から任意の項目を追加できます。戻り値は新しい配列の長さであり、元の配列に影響します。

splice () メソッド、Gao Chengsan はこれを最も強力な配列メソッドと賞賛しました

任意の数の項目を削除します

2 つのパラメーターを指定します: (削除開始位置、削除する項目の数)

任意の数の項目を挿入

3 つのパラメーターを指定します: (開始位置、0、挿入する項目)

2 番目のパラメーター 0 は削除する番号です

置換、つまり削除 任意の数の項目を挿入しながら、任意の数の項目を挿入します。

#3 つのパラメータを指定します: (開始位置、削除する番号、任意の挿入する項目数)

戻り値 常に、元の配列から削除された項目を含む配列。項目が削除されない場合は、空の配列が返され、元の配列に影響します。

改良版

上記の概要からわかるように、splice() メソッドは unshift( ) 方法。

また、最初のバージョンには重複したコードがいくつかありますが、これも改善することができます。

コードの 2 番目のバージョンを取得します

// 第二版
Array.prototype.fakeReduce = function fakeReduce(fn, base) {

  let initialArr = this;
  let arr = initialArr.concat();

  if (base) arr.unshift(base);
  let index, newValue;

  while (arr.length > 1) {
    index = initialArr.length - arr.length + 1;
    newValue = fn.call(null, arr[0], arr[1], index, initialArr);

    arr.splice(0, 2, newValue); // 直接用 splice 实现替换
  }

  return newValue;
};

検出:

let arr = [1, 2, 3, 4, 5];
let sum = arr.fakeReduce((prev, cur, index, arr) => {
  console.log(prev, cur, index, arr);
  return prev * cur;
}, 100);

console.log(sum);

出力:

100 1 0 [ 1, 2, 3, 4, 5 ]
 100 2 1 [ 1, 2, 3, 4, 5 ]
 200 3 2 [ 1, 2, 3, 4, 5 ]
 600 4 3 [ 1, 2, 3, 4, 5 ]
 2400 5 4 [ 1, 2, 3, 4, 5 ]
 12000

最後に型検出などを追加します.

// 第三版
Array.prototype.fakeReduce = function fakeReduce(fn, base) {
  if (typeof fn !== "function") {
    throw new TypeError("arguments[0] is not a function");
  }
  let initialArr = this;
  let arr = initialArr.concat();

  if (base) arr.unshift(base);
  let index, newValue;

  while (arr.length > 1) {
    index = initialArr.length - arr.length + 1;
    newValue = fn.call(null, arr[0], arr[1], index, initialArr);

    arr.splice(0, 2, newValue); // 直接用 splice 实现替换
  }

  return newValue;
};

[推奨学習:

JavaScript 上級チュートリアル

]

以上がJavaScriptでreduceメソッドを使う方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。