數組reduce方法以及高級技巧
基本概念:
reduce()方法接收一個函數作為累加器,數組中的每個值(從左到右)開始縮減,最終為一個值。
reduce為數組中的每一個元素依次執行回調函數。不包括數組中被刪除或從未賦值的元素,接受兩個參數。第一參數是一個回調函數,又接收四個參數:初始值(或者上一次回調函數的返回值),當前元素值,當前索引,調用reduce的數組。第二個參數是作為第一次調用callback的第一個參數即初始參數。
語法:
arr.reduce(callback, [initialValue])
* callback(執行數組中每一個值得函數,包含四個參數)
previousValue(上一次調用回返回的值,或者是提供的初始值(initialValue))
currentValue(數組中當前被處理的元素)
index(當前元素在數組中的索引)
array(調用reduce的數組)
* inatialValue(作為第一次調用callback的第一個參數)
簡單應用
可以看出,reduce函數根據初始值1,不斷地進行疊加,完成最簡單的遞歸
reduce函數的返回值結果類型和傳入的初始值相同,上個實例中初始值為number類型,同理,初始值也可以為object類型
進階應用
使用reduce方法可以完成多維的數據疊加,如上例中的初始值{sum: 0},這僅僅是一個維度的操作,如果涉及到了多個屬性的疊加,如: {sum: 0, totalInEuros: 0, totalInYen: 0}, 則需要相應邏輯進行處理。
在下面的方法中,采用分而治之的方法,即將reduce函數第一個參數callback封裝一個數組,有數組中的每一個函數單獨進行疊加並完成reduce操作。所有的一切通過一個manager函數來管理流程和傳遞初始參數。
前方高能!!!!!我也是花了半個多小時才看懂研究出來的,已經加上註釋了,希望能夠幫助你,有興趣的可以研究下
上面manager函數的實現,他需要reducers對象作為參數,並返回一個callback類型的函數,作為reduce的第一個參數,在該函數內部,則執行多維的疊加工作(Object.key())。通過這種分而治之的思想,可以完成對象的多個屬性同時疊加。
再來舉一個例子:某個同學的期末成績如下表示
如何求該同學的總成績?
假設同學因為違紀被處罰在總成績扣10分,只需要將初始值-10即可。
接下來舉的這個例子,增加一點難度。假設該同學的總成績中,各科所占的比重不同,分別為:50%, 30%, 20%,我們應該如何求出最終的權重結果呢?
再來看一個例子, 如何知道一串字符串中每個字母出現的次數
由於可以通過第二個參數設置疊加結果的類型初始值,因此這個時候reduce就不僅僅是做一個加法了, 我們可以靈活運用它來進行各式各樣的類型轉換為對象,也可以將一種形式的數組轉換為另一種形式的數組。可以動手嘗試一下。
koa(node的框架)源碼中,有一個only模塊,整個模塊就一個簡單的返回reduce方法操作的對象:
希望以上的內容會對你對reduce有更深層次的了解,謝謝!
數組reduce方法以及高級技巧