前言
在大部分語言,第一次接觸到的陣列處理方法不外乎是 for、while 等等,但現代開發講求效率以及可讀性,當有其他判斷需求,整個處理的結構就會變得很複雜,這次來紀錄一下 ES6 新增的幾種陣列處理方法,包括 filter、map 等方法,在實戰中,可大幅的幫助開發,自己使用下來,效果顯卓!
筆記重點
- forEach()
- filter()
- find()
- map()
- every()
- some()
- reduce()
傳統陣列處理方法
一般人對於陣列的處理方式大多都是使用 for 迴圈就可以滿足基本應用,主要利用迴圈變數取出陣列中的項目,再依序做處理,如下範例:
1 | let object = [ |
雖然說傳統方法也不錯,不過當程序複雜時,難免會有可讀性較差等問題,如果要搭配其他方法做應用,整個程序只會變得更加複雜,ES6 新增的陣列處理方法就是為了解決這一個問題。
初始作用陣列
在下面陳述 ES6 的陣列方法時,都會直接以實例的方式做紀錄,針對所作用的陣列,就直接記錄在這邊,可再自行比對。
1 | let object = [ |
Array.prototype.forEach()
forEach()
是陣列方法中最單純的一個,他也是最好理解的一個,用法類似於 for 迴圈,相比之下,更讓人容易理解,應用。如下範例:
- 特性:可直接利用參數操作陣列內容
- callback 參數:currentItem、index、array
1 | object.forEach(function(item, index, array) { |
Array.prototype.filter()
filter()
是我最愛使用的一個方法!傳統過濾陣列都是使用 for 迴圈加上許多判斷式, filter()
結合了兩者功能,配合箭頭函式,大幅提高效率與可讀性。如下範例:
- 特性:依序判斷項目內容,如果為 True 即放入新陣列,最後回傳新陣列
- callback 參數:currentItem、index、array
1 | let data1 = object.filter(function(item, index, array) { |
Array.prototype.find()
find()
類似於 filter()
,不過其處理為回傳首個符合的項目,還有一個類似方法叫 findIndex()
,處理方式與 find()
相同,不過是回傳索引值。如下範例:
- 特性:依序判斷項目內容,回傳第一次判斷為 True 的項目
- callback 參數:currentItem、index、array
1 | let data1 = object.find(function(item, index, array) { |
Array.prototype.map()
map()
主要用來做陣列的修改,或是整體項目的判斷,通常可搭配展開做內容新增。如下範例:
- 特性:依序處理項目內容,回傳陣列長度等於作用陣列長度
- callback 參數:currentItem、index、array
- 注意:預設項目內容為 undefined
1 | let data1 = object.map(function(item, index, array) {}); |
Array.prototype.every()
every()
可用來檢查陣列項目是否符合條件,類似於 AND 處理,全部項目都符合,回傳 True。如下範例:
- 特性:判斷全部項目是否都符合條件,否則回傳 False
- callback 參數:currentItem、index、array
- 注意:回傳內容只有 True 和 Flase
1 | let data1 = object.every(function(item, index, array) { |
Array.prototype.some()
some()
類似於 every()
,等同 OR 處理,部分項目符合,回傳 True,如下範例:
- 特性:一個(含)以上項目符合條件,回傳 True
- callback 參數:currentItem、index、array
- 注意:回傳內容只有 True 和 Flase
1 | let data1 = object.some(function(item, index, array) { |
Array.prototype.reduce()
reduce()
主要用來做累加應用或者是項目間的判斷,如下範例:
- 特性:初始化數值(前一個數值),可由後方傳入
- callback 參數:accumulator、currentItem、index、array
- 注意:全部操作皆由初始數值與當前項目做應用
1 | let data1 = object.reduce(function(accumulator, currentValue, currentIndex, array) {}); |