1. 程式人生 > >JavaScript陣列的歸併方法(reduce和reduceRight)

JavaScript陣列的歸併方法(reduce和reduceRight)

ES5 為陣列增加了兩個歸併陣列的方法:reduce( ) 和 reduceRight( ) 。這兩個方法都會迭代陣列的所有項,然後構建一個最終返回值。 其中 reduce 從第一項開始向後遍歷,reduceRight( ) 則從最後一項開始向前遍歷。

這兩個方法都接收兩個引數:一個在每一項上呼叫的函式和(可選的)作為歸併基礎的初始值。

傳給這兩個方法的函式接收四個引數:前一個值,當前值,項的索引和陣列物件。這個函式返回的任何值都會作為第一個引數傳給下一項。


reduce ( )

在只傳一個引數(給定函式)的情況下,第一次迭代發生在第二項上,因此第一個引數是陣列的第一項,第二個引數就是第二項。
如果傳兩個引數(也就是給定作為歸併基礎的初始值)的話,第一次迭代發生在第一項上,第一個引數是初始值,第二個引數是第一項。

《JavaScript高階程式設計》書中說第一次迭代發生在第二項上,因此第一個引數是陣列的第一項,第二個引數就是第二項。但是我認為應該是上面我說的在只傳一個引數的情況下,如果傳兩個引數,則給定的初始值會作為第一個引數,第一項作為第二個引數。具體可以看下面例子。

例如:

var values = [1, 2, 3, 4, 5]
// 只傳一個函式,不設定歸併初始值
var res1 = values.reduce(function(prev, cur, index, array){
    return prev - cur;
})
// 傳兩個引數,給定歸併初始值
var res2 =
values.reduce(function(prev, cur, index, array){ return prev - cur; }, 5) alert(res1) // -13 1-2-3-4-5=-13 alert(res2) // -10 5-1-2-3-4-5=-10

reduceRight ( )

reduceRight ( ) 的功能與 reduce ( ) 相同,只不過是從後向前遍歷,除此之外二者完全相同。看下面例子:

var values = [1, 2, 3, 4, 5]
var res1 = values.reduceRight(function(prev,
cur, index, array){ return prev - cur; }) var res2 = values.reduceRight(function(prev, cur, index, array){ return prev - cur; }, 5) alert(res1) // -5 5-4-3-2-1=-5 alert(res2) // -10 5-5-4-3-2-1=-10