js數組中的reduce方法

簡單介紹

reduce可以對數組中的元素從index 0到length-1依次處理,每個元素的處理結果會作為處理下一個元素時所需要的參數,當所有元素處理結束后返回累積結果。

var a = [1,2,3,4]; 
a.reduce(function(a,b,index,array){ 
  console.log(a + " and " + b + " index:" + index);  
  return a+b; 
},1);
******************************************************
1 and 1 index:0
2 and 2 index:1
4 and 3 index:2
7 and 4 index:3
11

上述例子在chrome的console下運行后可看到結果,該例子傳入了兩個參數,callback為單純的累加函數,initialValue為1
為什么會出現log這樣的結果呢?接下來分析一下reduce的兩個參數


參數callback與initialValue

官方給出的reduce使用方法如下

 arr.reduce(callback[,initialValue])

接收兩個參數,第一個參數callback為必選,第二個initialValue為可選

callback

假設當前場景為正在對數組的第n元素進行callback處理

  • accumulator:累加器,該參數的值為第n-1個元素處理后的返回值
  • currentValue:該參數值為第n個元素的值
  • currentIndex:第n個元素的index
  • array:當前數組的引用

initialValue

callback的第一個參數為第n-1個參數處理后的返回值,可是如果n=1(即剛對第一個元素進行callback處理)時accumulator值是多少呢?
initialValue作用就在于解決第一次處理時accumulator值的問題,如果傳入了initialValue,那么第一次callback中accumulator值等于initialValue

接下來根據例子來看initialValue存在與否對reduce執行流程的影響

var a = [1,2,3,4]; 
a.reduce(function(a,b,index,array){ 
  console.log(a + " and " + b + " index:" + index);  
  return a+b; 
});   //可選參數initialValue未傳入
**************************************************************
1 and 2 index:1
3 and 3 index:2
6 and 4 index:3
10

與文章開篇的第一個例子對比可以發現,傳入initialValue時callback執行了4次,未傳入則執行了3次,數組明明有4個元素,這是什么原因呢?

reduce官方介紹說的非常清楚。

initialValue.png

大致意思就是說如果傳入initialValue,則callback的accumulator值為initialValue,currentValue為arr[0],如果未傳入則accumulator值為arr[0],currentValue為arr[1]
如果未傳initialValue的話currentValue會從數組中第二個元素開始,第一個元素會充當accumulator,這也就解釋了為何兩個例子中callback執行次數不同。

應用

每一個新技術的出現都是為了解決一類問題,reduce也不例外,當我們想將數組元素或者元素中的某些內容累積時,reduce可以很方便的解決我們的問題。
具體應用請參考官方文檔

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容