對javascript中reduce函式探索
阿新 • • 發佈:2018-12-26
看標題估計很多人都懵了,一個ES內建的函式reduce有什麼好講的
reduce的定義
reduce
對陣列中的每個元素執行一個由您提供的reducer函式(升序執行),將其結果彙總然後返回。
reduce的語法
arr.reduce(callback,initialValue)
callback
函式:
accumulator
累計器累計回撥的返回值currentValue
當前元素currentIndex
當前元素的索引 (可選)arr
當前陣列 (可選)
initialValue
作為第一次呼叫 callback
tips:如果你不寫initialValue
,callback
函式的第一次呼叫從陣列索引1
開始,如果提供initialValue
,從索引0
開始
很多人喜歡這樣寫
arr.reduce(function(prev,next){},initialValue)
這樣也沒有錯,但是很容易讓人理解為類似於for迴圈,不就前一個後一個嘛然後迴圈,其實這裡的prev
是前一輪呼叫回撥時返回的累積值,或initialValue
建議寫法:
arr.reduce((acc,cur,index,arr)=>{},initialValue)
reduce函式如何執行
[0, 1, 2, 3, 4].reduce((acc, cur, index, arr)=>{
return acc + cur;
});
按照上面的說明,不提供initialValue
,那麼callback
,將從索引1
開始,所以callback
將會呼叫四次
callback | acc | cur | index | arr | return |
---|---|---|---|---|---|
1 | 0 | 1 | 1 | [0,1,2,3,4] | 1 |
2 | 1 | 2 | 2 | [0,1,2,3,4] | 3 |
3 | 3 | 3 | 3 | [0,1,2,3,4] | 6 |
5 | 6 | 4 | 4 | [0,1,2,3,4] | 10 |
從上面的表格我們可以非常直觀的看到callback
是如何一步一步把一個數組求和的
函數語言程式設計中的reduce
函數語言程式設計屬於js高階技巧吧,主要依靠那幾個ES提供的函式來實現。
阮一峰老師的函數語言程式設計入門
案例(多維陣列降維)
let flateen=(arr)=>{
return arr.reduce((acc,cur)=>{
return acc.concat(Array.isArray(cur)?flateen(cur):cur)
},[])
}
意思是從索取0
開始,判斷當前元素是否是陣列,如果是,那麼進行遞迴,如果不是就返回當前陣列,然後和前一輪的返回值(一個一緯陣列)進行拼接
reduceRight
和reduce
是一樣的,只不過reduce是從左到右遍歷,而reduceRight
是從右到左遍歷,其他什麼,語法啊,用法都一樣。
arr.reduceRight((acc, cur, index, arr) =>{
// ...
},initialValue);
稍微有點不同的是,如果沒有提供initialValue
引數,則 acc
等於陣列最後一個值, cur
等於陣列中倒數第二個值,因為是從右到左嘛。
與reduce之間的區別(案例)
var a = ['1', '2', '3', '4', '5'];
var left = a.reduce((acc, cur) =>{ return acc + cur; });
var right = a.reduceRight((acc, cur) => { return acc + cur; });
console.log(left); // "12345"
console.log(right); // "54321"