ホームページ > 記事 > ウェブフロントエンド > js の Array.reduce メソッドを 1 つの記事で徹底的に理解する
この記事では、js に関する知識を紹介します。主に js の Array.reduce メソッドについて説明します。興味のある友達は一緒に見てください。皆さんのお役に立てれば幸いです。
私たちは、計算やデータの組み合わせを行うために Array オブジェクトの Reduce メソッドをよく使用します。それはよく、初期値を渡さなくても正常に動作すること、そしてコードを拡張するために配列を関数の配列にすることもできることを最近発見しました。
この記事では、Array.reduce とアプリケーションのシナリオをもう一度理解します。
MDN での説明を見てみましょう:
reduce()
このメソッドは、配列内の各要素に対して、指定された reducer 関数を順番に実行します。reducer が実行されるたびに、前の要素の計算結果が渡されます。パラメータとして取得し、最後に結果が 1 つの戻り値にまとめられます。
このコードを見てみましょう:
const arr = [1, 2, 3] const initValue = 10; function reducer(previousValue, currentValue, currentIndex, arrryTarget) { return preValue + currentValue } arr.reduce(reducer, initValue) // res === 16
reduce は arr 配列を走査し、reducer は配列の数だけ実行されます。各実行プロセスのパラメータ (arrryTarget は同じなので、元の配列がトラバーサル プロセス中に直接変更されない限り意味がないため、ここでは考慮しません) は次のとおりです。
previousValue |
currentValue |
##currentIndex |
return
|
|
---|---|---|---|---|
1 |
#0
|
11
|
##2 回目の実行
| 11|
2 |
| 1
| 13 | #3 回目の処刑 #13 |
2 |
16 |
| このプロセスでreduceを使用したことのある人は、MDNの元の単語が次のようなものであることを知っているはずです: コールバック関数を初めて実行するときは、「最後の計算結果」はありません。配列インデックス 0 の要素からコールバック関数の実行を開始する必要がある場合は、初期値を渡す必要があります。それ以外の場合、配列インデックス 0 の要素が初期値 | initialValue
arr.length
はreducer現時点では、リデューサーはと等しいです。処刑の数。 しかし、初期値が渡されなかったらどうなるでしょうか?コードを変更しましょう:
const arr = [1, 2, 3] - const initValue = 10; function reducer(previousValue, currentValue, currentIndex, arrryTarget) { return preValue + currentValue } - arr.reduce(reducer, initValue) // res === 16 + arr.reduce(reducer) // res === 6
arr.length - 1 回のみ実行します。各実行のパラメータは次のとおりです。
#reducer
#previousValue
currentIndex |
return
|
#最初の実行 |
1
| ##2|
---|---|---|---|---|
3 |
| #2 回目の実行##3 |
##3
| 2
|
<p>因为没有传递初始值,因此 <code>reducer 函数从数组索引为 1 的元素开始执行,首次执行的时候 arr[0] 被作为了 previousValue ,currentValue 为是 arr[1] 。
现在了 reduce 的基本用法,那么它的运用场景有哪些呢? reduce 的运用场景用于计算数据因为 reducer 函数会重复执行 比如累加,计算订单总金额等案例: const orders = [{ id: 1, amount: 10 }, { id: 2, amount: 12 }, { id: 3, amount: 5 }] const totalAmount = orders.reduce((sum, order) => sum + order.amount, 0); // 27 累加可以,那么 [true, true, false, true].reduce((a, b) => a & b); // 有false,按照与逻辑,一定会是false 将多维数组转为一维数组reduce 可以很轻松的将二维数组转为一维数组。示例: [[1,2], [3, 4]].reduce((arrA, arrB) => [...arrA, ...arrB]) 那是不是封装一下就可以把多维数组组转为一维数组了?当然可以: function flaten(arr) { if(!Array.isArray(arr)) { return arr; } return arr.reduce((result, item) => { // 不是数组,则直接放在数组末尾 if(!Array.isArray(item)) { result.push(item); return result; } return result.concat(flaten(item)) }, []) } flaten([1,2, [3, 4], [6, [7, 8]]]) // [1, 2, 3, 4, 6, 7, 8] 这样就很简单的实现一个深层次的 flaten 。 将函数作为参数将函数作为参数的话,运用场景在哪里?比如: [func1, func2. func3, func4].reduce((value, funcN) => funcN(value), value), 执行顺序: func1 => func2 => func3 => func4, 这个效果就和 pipe 很像了是不是?这样封装一下就可以让函数执行扁平化。而不是 其他场景MDN 其实还描述了很多使用场景,大家都可以去探索一下,总之 reduce 的功能很强大,俗称“万金油”不是没有道理的。 这里就简单列一下:
最后js中其实有很多函数功能都很强大,这些函数的强大其实还是因为js本身的机制带来的,函数在js中是一等公民,注定会逐渐影响我们的编码风格,因此大家可以去了解和学习函数式编程,它能让你的代码写的更轻松。 推荐学习:《JavaScript视频教程》 |
以上がjs の Array.reduce メソッドを 1 つの記事で徹底的に理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。