JavaScript reduce()的使用

BingNiTer發表於2020-10-08

語法

arr.reduce(callback(accumulator, currentValue, index, array), initialValue)

引數

callback

執行陣列中每個值 (如果沒有提供 initialValue則第一個值除外)的函式,包含四個引數:

accumulator

累計器累計回撥的返回值; 它是上一次呼叫回撥時返回的累積值,或initialValue(見於下方)。

currentValue

陣列中正在處理的元素。

index

陣列中正在處理的當前元素的索引。 如果提供了initialValue,則起始索引號為0,否則從索引1起始。

array

呼叫reduce()的陣列

initialValue

作為第一次呼叫 callback函式時的第一個引數的值。 如果沒有提供初始值,則將使用陣列中的第一個元素。 在沒有初始值的空陣列上呼叫 reduce 將報錯。

返回值

函式累計處理的結果

描述

reduce為陣列中的每一個元素依次執行callback函式,不包括陣列中被刪除或從未被賦值的元素,接受四個引數:

  • accumulator 累計器
  • currentValue 當前值
  • currentIndex 當前索引
  • array 陣列

回撥函式第一次執行時,accumulator currentValue的取值有兩種情況:如果呼叫reduce()時提供了initialValue,accumulator取值為initialValue,currentValue取陣列中的第一個值;如果沒有提供 initialValue,那麼accumulator取陣列中的第一個值,currentValue取陣列中的第二個值。

注意:如果沒有提供initialValue,reduce 會從索引1的地方開始執行 callback 方法,跳過第一個索引。如果提供initialValue,從索引0開始。

如果陣列為空且沒有提供initialValue,會丟擲TypeError 。如果陣列僅有一個元素(無論位置如何)並且沒有提供initialValue, 或者有提供initialValue但是陣列為空,那麼此唯一值將被返回並且callback不會被執行。

提供初始值通常更安全,正如下面的例子,如果沒有提供initialValue,則可能有四種輸出:

var maxCallback = ( acc, cur ) => Math.max( acc.x, cur.x );
var maxCallback2 = ( max, cur ) => Math.max( max, cur );

// reduce() 沒有初始值
[ { x: 2 }, { x: 22 }, { x: 42 } ].reduce( maxCallback ); // NaN
[ { x: 2 }, { x: 22 }            ].reduce( maxCallback ); // 22
[ { x: 2 }                       ].reduce( maxCallback ); // { x: 2 }
[                                ].reduce( maxCallback ); // TypeError

// map/reduce; 這是更好的方案,即使傳入空陣列或更大陣列也可正常執行
[ { x: 22 }, { x: 42 } ].map( el => el.x )
                        .reduce( maxCallback2, -Infinity );

相關文章