1. 程式人生 > >對javascript中reduce函式探索

對javascript中reduce函式探索

看標題估計很多人都懵了,一個ES內建的函式reduce有什麼好講的

reduce的定義

reduce對陣列中的每個元素執行一個由您提供的reducer函式(升序執行),將其結果彙總然後返回。

reduce的語法

arr.reduce(callback,initialValue)

callback函式:

  • accumulator累計器累計回撥的返回值
  • currentValue當前元素
  • currentIndex當前元素的索引 (可選)
  • arr當前陣列 (可選)

initialValue

作為第一次呼叫 callback

函式時的第一個引數的值 (可選)

tips:如果你不寫initialValuecallback函式的第一次呼叫從陣列索引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"