雖然不完全是 ES6 語法糖,但在比較舊的瀏覽器就無法支援這些語法,所以使用上要注意,透過下方幾個語法,可以精簡的處理陣列資料的程式碼。
範例資料
本次皆使用下方陣列資料 (除了 sort()
以外):
1 | const arr = [ |
forEach & map
這兩個語法大概有 87% 像,但又有點不同,這兩個語法都跟 for 迴圈的功能類似,原生語法要取得陣列資料會這樣寫:
1 | // 資料長度 |
forEach
使用 forEach 更精簡的寫法,方式是在資料名稱後方加入 forEach 語法,後面接一個 function,參數分別帶入。
1 | arr.forEach(function (item, index, array) { |
- item: 代表陣列資料的內容,這邊陣列資料中的資料為物件。
- index: 索引位置,從 0 開始。
- array: 代表陣列資料本身(基本上沒有使用)。
若在 item 增加一個 icash 資料新增金額,可以這樣寫:
1 | arr.forEach(function (item, index, array) { |
forEach 本身不會回傳。
map
承上,把 forEach 換成 map,得到的結果也會相同。
1 | arr.map(function (item, index, array) { |
如果要使用 map 回傳一個新的陣列資料可以這樣寫:
1 | const newArr = arr.map(function (item, index, array) { |
newArr 跟 arr 會是兩個不同的陣列資料。
- map 本身會回傳,類似於 return 的功能。
- 一般使用回傳的特性,會拿來做篩選,但 map 若沒有使用 return 語法,會回傳 undefined,所以 map 不適合拿來做篩選的功能。
filter & find
filter
filter 寫法跟上方一樣,return 的值也很單純,只有 true 或 false,
1 | const filterArr = arr.filter(function (item, index) { |
若今天要篩選 money 小於 6000 的方法可以這樣寫:
1 | const filterArr = arr.filter(function (item, index) { |
filter 會篩選所有相符的條件並做回傳,回傳的資料會是一個陣列。
find
find 跟 filter 有點像,
1 | const findArr = arr.find(function (item, index) { |
find 找到相符的一筆資料後就會停止,只會回傳一次,回傳的資料會依照 item 的內容照實回傳,EX. 是字串就回傳字串,比較適合用來找 id 或是指定的元素。
every & some
這兩種語法基本上一樣,都是回傳布林值,差別如下:
- every 需所有條件相符才會回傳 true,有一條件不符就會回傳 false。
- some 只要有部分條件相符就會回傳 true。
程式碼如下:
every
1 | const newArr = arr.every(function (item, index) { |
some
1 | const newArr = arr.some(function (item, index) { |
reduce
適合拿來做加總的方法,起手式為:
1 | const newArr = arr.reduce(function (prev, item, index) {}, 0); |
跟前面不同的是在函式後面加上一個逗號,逗號後面的參數為起始值。
參數說明:
- 第一個參數代表上一個,若沒有上一個的話,就是在逗號後面寫上 0。
- 第二個參數代表當前的資料。
- 第三個參數代表索引。
來看一下 prev 的值:
1 | const newArr = arr.reduce(function (prev, item, index) { |
因為陣列資料有四筆,所以從頭開始總共會得到四筆資料。
計算所有人加總的數值
若要計算所有人擁有的錢,可以這樣寫:
1 | const newArr = arr.reduce(function (prev, item, index) { |
比大小
可以透過 reduce 去做所有資料內容的對比,會選出指定條件的值,這邊選出最大值來看看。
1 | const newArr = arr.reduce(function (prev, item, index) { |
sort()
會改變原本的陣列內容。下方有一組陣列沒有按照順序,使用 sort(); 方法,並帶入頭尾參數做為判斷,便會按照順序排列或反向排列。
1 | const arr = [1, 5, 8, 7, 4, 6, 3, 2]; |
但若不使用判斷,則不會按照順序排列。
1 | const arr2 = [1, 5, 8, 7, 4, 6, 3, 2, 10, 9, 11]; |