JavaScript - ES6 - 陣列方法
ES6 以前在處理陣列都是使用 for
迴圈,以陣列元素的數量來設定 for 迴圈
的次數,ES6 新增了許多方法來搭配 箭頭函式 =>
、樣板字串 template-string
使程式碼更精簡、直覺
以下是以往處理陣列中的資料時,透過 for 迴圈
一一取出資料的方法
1 | let wanted = [ |
而 jQuery 當然也有對應的方法來處理陣列,就是 $.each(array, function(index, item){})
,結果同上
array
: 要帶入的陣列index
: 索引item
: 陣列中的元素
1 | $.each(wanted, function (i, person){ |
以下一一介紹 ES6 所新增的陣列方法
forEach()
ES6 的 array.forEach((item, index, array) => {})
和 jQuery 的方法很類似,只是帶入的參數位置不太一樣,以下範例同時加入 “箭頭函式” 和 “樣板字串”
item
: 陣列中的元素index
: 索引array
: 整個陣列,也較少用到
1 | wanted.forEach(person => console.log(`${person.name} 懸賞 ${person.price} 億貝利`)); |
無法被中斷
forEach()
無法被中斷,如果加入 break
會出現錯誤 Error
,所以如果需要中斷還是要使用 for 迴圈
1 | wanted.forEach(person => { |
無法使用的陣列
在物件中,有許多物件有著陣列的外觀但不能使用陣列的所有方法稱為 “類陣列” Array-like
,其中有部分的類陣列 “不能” 使用 forEach()
arguments
: 無法使用forEach()
,會跳錯DOM 陣列
: 可以使用forEach()
判斷物件是否有指定的方法可以從 console
中的原型 __proto__
來查看
不會回傳
在 forEach()
中不會有回傳值,所以將其賦予一個變數會得到 undefined
1 | var forEachReturn = wanted.forEach(person => console.log(`${person.name} 懸賞 ${person.price} 億貝利`)); |
filter()
顧名思義 filter()
可以用來過濾陣列中符合條件的元素,但並不會對元素進行修改,將條件寫在 return
中就會回傳,如果沒有設定條件就會回傳空陣列
1 | var filterEmpty = wanted.filter((item, index, array) => {}); |
find()
用來搜尋陣列中符合條件的物件,但 “只能有一個”,如果符合條件的物件大於一個,就只會回傳第一個 ; 同樣的,如果沒有設定條件就會回傳 undefined
1 | var findEmpty = wanted.find((item, index, array) => {}); |
map()
map()
與 forEach
最大的不同就是可以回傳新陣列,並透過新的變數來接收,如下範例因為是透過展開 ...
賦值,所以兩個陣列並沒有任何關聯
1 | const newWanted = people.map((item, index, array) => { |
回傳的新陣列與原陣列長度相同,不符合的物件會出現 undeined
,如果沒有寫 return
還是全部都會回傳 undefined
,所以如果要過濾元素,就不適合使用 map
,map
適合單純調整元素的內容
1 | var mapEmpty = wanted.map((item, index, array) => {}); |
every()
用來驗證全部的結果
- 如果全部為
true
,回傳true
- 如果有一為
false
,回傳false
1 | let tenUp = wanted.every((item, index, array) => { |
some()
同樣用來驗證全部結果,但條件與 every()
不一樣
- 只要有一為
true
,回傳true
- 如果全部為
false
,回傳false
1 | let tenUp = wanted.some((item, index, array) => { |
reduce()
reduce()
是 ES6 陣列方法當中最特別的一個,其參數函先前的方法不一樣,他會將前一個回傳的值和下一個物件再做計算,很適合用在累加上,該方法可以拆解成以下方式
1 | [x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4); |
previousValue
: 前一個參數,如果是第一個元素,那這個值就是另外傳入或初始化的值currentValue
: 當下這個參數index
: 當下這個索引array
: 整個陣列initialValue
: 初始化的值
同樣的,如果沒有回傳結果會是 undefined
,其中 0
就是 initialValue
加總
加總是 reduce
很常用到的技巧,只要將前一個值與當下的值相加,就會得到加總
1 | let wanted = [ |
取最大值
reduce
是前一個值與當下的值不斷循環,所以透過 max
取較大值就可以取得最大值,同理最小值 min
也可以
1 | const maxPrice = wanted.reduce((pre, cur, i) => { |