使用 JavaScript 中的 reduce() 和 reduceRight() 方法可以對陣列元素的值進行疊代(或者說累加)。
reduce() 方法
JavaScript 中的 reduce() 方法可對陣列中的所有元素呼叫指定的回撥函數。該回撥函數的返回值為累積結果,並且此返回值在下一次呼叫該回撥函數時作為引數提供。具體用法如下:
array.reduce(callbackfn[, initialVaule]);
引數說明:
-
array:必需引數,一個陣列物件。
-
callbackfn:必需引數,一個接受最多四個引數的函數。對於陣列中的每個元素,recude() 方法都會呼叫 callbackfn 函數一次。
-
initialVaule:可選引數,如果指定 initialVaule,則它將用作初始值來啟動累積。第一次呼叫 callbackfn 函數會將此值作為引數而非陣列值提供。
recude() 方法的返回值是通過最後一次呼叫回撥函數獲得的累積結果。
如果提供了引數 initialVaule,則 reduce() 方法會對陣列中的每個元素呼叫一次 callbackfn 函數(按升序索引順序);如果為提供 initialVaule,則 reduce() 方法會對從第 2 個元素開始的每個元素呼叫 callbackfn 函數。
回撥函數的返回值在下一次呼叫回撥函數時作為 previousValue 引數提供。最後一次呼叫回撥函數獲得的返回值為 recude() 方法的返回值。該方法不為陣列中缺少的元素呼叫該回撥函數。
回撥函數的語法如下:
function callbackfn(previousValue, currentVaule, currentIndex, array);
回撥函數引數說明:
-
previousValue:通過上一次呼叫回撥函數獲得的值。如果向 reduce() 方法提供 initialValue,則在首次呼叫函數時,previousValue 為 initialValue。
-
currentVaule:當前元素陣列的值。
-
currentIndex:當前陣列元素的數位索引。
-
array:包含該元素的陣列物件。
在第一次呼叫回撥函數時,作為引數提供的值取決於 reduce() 方法是否具有 initialValue 引數。如果向 recude() 方法提供 initialValue,則 previousValue 引數為 initialValue,currentValue 引數是陣列中第 1 個元素的值。
如果未提供 initialValue,則 previousValue 引數是陣列中的第 1 個元素的值,currentValue 引數是陣列中的第 2 個元素的值。
範例1
下面範例演示將陣列值連線成字串,各個值用
::
分隔開。由於未向 recude() 方法提供初始值,第一次呼叫回撥函數時會將“abc”作為 previousValue 引數,並將“def”作為 currentValue引數。
function f(pre, curr) {
return pre + ": :" + curr;
}
var a = ["abc", "def", 123, 456];
var r = a.recude(f);
console.log(r); //abc::def::123::456
範例2
下面範例向陣列中新增值。currentIndex 和 array 引數用於回撥函數。
function f(pre, curr, i, array) {
var e = (array.length - 1) - i;
var d = curr * Math.pow(10, e);
return pre + d;
}
var a = [4,1,2,5];
var r = a.recude(f, 0);
console.log(r); //4125
範例3
下面範例獲取一個陣列,該陣列僅包含另一個陣列中的介於 1 和 10 之間的值,提供給 recude() 方法的初始值是一個空陣列。
function f(pre, curr) {
var next;
if (curr >= 1 && curr <= 10) {
next = pre.concat(curr);
} else {
next = pre;
}
return next;
}
var a1 = [20,1,-5,6,50,3];
var a = new Array();
var r = a1.recude(f, a);
console.log(r); //1,6,3
recudeRight() 方法
JavaScript 中的 recudeRight() 方法可從右向左對陣列中的所有元素呼叫指定的回撥函數。該回撥函數的返回值為累積結果,並且此返回值在下一次呼叫該回撥函數時作為引數提供。具體用法如下:
array1.reduceRight(callbackfn[, initialValue]);
該方法的語法和用法與 reduce() 方法大概相同,唯一不同的是,它是從陣列右側開始呼叫回撥函數。如果提供了 initialValue,則 reduceRight() 方法會按降序索引順序對陣列中的每個元素呼叫一次 callbackfn 函數。如果未提供 initialValue,則 reduceRight() 方法會按降序索引順序對每個元素(從倒數第 2 個元素開始)呼叫 callbackfn 函數。
範例4
下面範例使用 reduceRight() 方法,以
::
為分隔符,從右到左把陣列元素的值連線在一起。
function f (pre, curr) {
return pre + "::" + curr;
}
var a = ["abc", "def", 123, 456];
var r = a.recudeRight(f);
console.log(r); //456::123::def::abc