js陣列方法之Reduce

admin發表於2020-06-17

reduce()和reduceRight()方法使用指定的函式將陣列元素進行組合,生成單個值,這個生成單個值很重要,開發過程中往往會用到這個值。這在函數語言程式設計中是常見的操作,通常被稱為“注入”和“摺疊”。

下面先舉例說明一下reduce是如何工作的:

[JavaScript] 純文字檢視 複製程式碼
var a = [1,2,3,4,5];
var sum = a.reduce((x,y) => x+y, 0);  // 陣列求和
var product = a.reduce((x,y) => x*y, 1);  // 陣列求積
var max = a.reduce((x,y) => (x>y) ? x : y);  // 求最大值

reduce()需要兩個引數。第一個是執行化簡操作的函式。華簡函式的任務就是用某種方法把兩個值組合或化簡為一個值,並返回化簡後的值。在上述的例子中,函式通過加法,乘法或取最大值法的方法組合兩個值。第二個引數是一個傳遞給函式的初始值,此引數是可選的,不傳的時候,預設是將陣列的第一個作為初始值使用。


reduce()使用的函式與forEach()和map()使用的函式不同。比較熟悉的是,陣列元素、元素的索引和陣列本身將作為第2~4個引數傳遞給函式。第一個引數是到目前為止的華簡操作累積的結果。第一次呼叫函式時,第一個引數是一個初始值,它就是傳遞給reduce()的第二個引數。


另外一點需要我們注意,那就是在空陣列上,不帶初始值引數呼叫reduce()將導致型別錯誤異常。如果呼叫它的時候只有一個值——陣列只有一個元素並且沒指定初始值,或者一個空陣列並且指定一個初始值——reduce()只是簡單地返回那個值而不會呼叫化簡函式。


reduceRight()函式的工作原理跟reduce()一樣,不同的是它按照的陣列索引的從高到低處理陣列。


下面舉個使用reduce()函式能快速解決問題的例子,題目如下:

一個無序陣列裡有若干個正整數,範圍從1到100,其中99個整數都出現了偶數次,只有一個整數出現了奇數次(比如1,1,2,2,3,3,4,5,5),如何找到這個出現奇數次的整數?

使用reduce()函式就很簡單的得到結果了

[JavaScript] 純文字檢視 複製程式碼
var arr = [1,1,2,2,3,3,4,5,5]
arr.reduce((x,y) => x^y);  // 即可得到答案 4

總結:

為了簡單起見,為目前為止,所展示的例子都是數值,但數學的計算不是reduce()和reduceRight()唯一意圖。這兩個函式可以結合其他函式可以達到意想不到的結果,而且在效能上也可能有大提升。

相關文章