1. 程式人生 > >數組reduce方法以及高級技巧

數組reduce方法以及高級技巧

高級 lba callback ren 封裝 call 動手 total 轉換

基本概念:

 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方法以及高級技巧