語法
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 );