recude 函數(shù)為 js 數(shù)組中較難理解的一個(gè)函數(shù),其定義如下:
定義
arr.reduce(callback,[initialValue])
其中callback函數(shù)有四個(gè)參數(shù):
-
previousValue
(第一次調(diào)用callback
函數(shù)時(shí)候趾徽,previousValue
值為reduce
函數(shù)的第二個(gè)參數(shù)initialValue
挖诸,如果沒有initialValue
則previousValue
值為數(shù)組的第一個(gè)元素斧吐,currentValue
為第二個(gè)元素召锈。第二次及以后的callback
函數(shù)調(diào)用previousValue
為上一次調(diào)用callback
函數(shù)的返回結(jié)果) -
currentValue
(數(shù)組中當(dāng)前被處理的元素) -
index
(當(dāng)前元素在數(shù)組中的索引渐扮,一般不用) -
array
(調(diào)用 reduce 的數(shù)組柑贞,一般不用)
用一句話來簡(jiǎn)單的概括就是:
- reduce函數(shù),為數(shù)組中的每一個(gè)元素執(zhí)行callback方法孔厉,并將每次callback方法的返回結(jié)果桐智,作為下一次調(diào)用callback方法的參數(shù) (通常也把這種思想叫做管道機(jī)制
pipeline
)
reduce函數(shù)常見的使用場(chǎng)景有:
數(shù)組的累加
var arry = [1, 2, 3, 4, 5, 6, 7];
var total = arry.reduce(function(sum, item) {
return sum + item;
}, 0);
console.log(total);
計(jì)算字符串中各字符的出現(xiàn)次數(shù)
var str = 'abcdcbcddacabcdad';
var result = str.split('').reduce(function(res, cur) {
res[cur] ? res[cur] ++ : res[cur] = 1
return res;
}, {})
console.log(result);
管道函數(shù)調(diào)用
//假如有一個(gè)流程包含5個(gè)步驟,每一步的參數(shù)為上一步的執(zhí)行結(jié)果
var init = 0;
function step5(arg){return arg + 5;};
function step4(arg){return arg + 4;};
function step3(arg){return arg + 3;};
function step2(arg){return arg + 2;};
function step1(arg){return arg + 1;};
var result1 = step5( step4( step3( step2( step1( init ) ) ) ) );
console.log(result1)
//等價(jià)于以下的寫法
var result2 = [step1,step2,step3,step4,step5].reduce((a, b) => b(a), init);
console.log(result2)
reduce
為ES5
中的一個(gè)新特性烟馅,所有使用reduce
實(shí)現(xiàn)的功能其實(shí)都能用for循環(huán)
來實(shí)現(xiàn),一個(gè)簡(jiǎn)單的實(shí)現(xiàn)如下:
Array.prototype.reduce = function(callback, init) {
var result;
for(var i = 0 ;i < this.length; i++){
result = i == 0 ? callback(init, this[i]) : callback(result, this[i]);
}
return result;
}
更為嚴(yán)謹(jǐn)?shù)膶?shí)現(xiàn)可以查看es5-shim.js中對(duì)reduce
的實(shí)現(xiàn)