這些方法差在哪?什麼時候應該用
當要尋找 Array 中符合條件的值時,該用哪種方式找才能最省時間或是能得到最符合你要的資料?要回答這個問題時,先確定你知道這些方法差異處,下面先簡單列出這四種方式所 console 出來的結果,在比較廣泛的說法來說,我會將他們的差異整理如下:
將 filter find 歸類在一類,因為他們都是回傳符合條件的元素
- filter:會回傳一個陣列,裡面有所有符合資格的元素,若沒有符合的值,則會回傳空陣列。
- find:會回傳第一個符合條件的值,若沒有符合的值,則是傳回undefined
將 some every 歸類在一類,因為他們都是回傳布林值
- some:會回傳布林值,當遇到第一個 True 則會結束函式並回傳 True
- every:也會回傳布林值,條件較嚴格,因此遇到第一個 False 就會結束函式並回傳 False
以上總結,並用下面的簡單程式運作讓大家看看實際差異
filter():回傳陣列
第一個來講filter吧,filter()
會將所有陣列中的元素分別傳入一次至 callback
函式當中,並回傳一個新的陣列。
語法:var newArray = arr.filter(callback(element[, index[, array]])[, thisArg])
element(必備)
原陣列目前所迭代處理中的元素。
index
目前所迭代處理中的元素之索引。
array
選擇性呼叫 filter
方法的陣列。
使用filter,可以針對array內的元素及index甚至是array做操作,如下:
const nums = [1, 2, 3, 4, 5, 6]const a = nums.filter(function(num, index){console.log(num * index)
// 0 2 6 12 20 30})
再更一層的應用可以用來篩選關鍵字,使用如下:
const fruits = [‘apple’, ‘banana’, ‘grapes’, ‘mango’, ‘orange’];function filterItems(query) { return fruits.filter(function(fruit) { return fruit.toLowerCase().indexOf(query.toLowerCase()) > -1;})} //針對fruit中每個元素做indexOf,當單字中有包含query時(也就是index>-1),才會放進篩選清單中console.log(filterItems(‘ap’)); // [‘apple’, ‘grapes’]console.log(filterItems(‘an’)); // [‘banana’, ‘mango’, ‘orange’]
參考資料:MDN(點擊查看)
find():回傳元素
find()
方法會對每個元素執行一次 callback
函式,直到找到一個讓 callback
函式會立刻回傳 true 的元素,並結束程式,若找到index底都還沒找到元素,則會回傳undefined
語法:var newArray = arr.find(callback(element[, index[, array]])[, thisArg])
基本上跟上面filter一樣的參數,和filter不同的地方是 find()只會回傳符合條件的第一個元素,因此若要找多個符合條件的元素,這個方法就不適合囉!
下面來舉一個在find裡面同時運用element和 index的程式,可以稍微了解一下他們的關係
const nums = [1, 2, 3, 4, 5, 6]const findNum = nums.find(function(num,index){ return num*index > 10})console.log(findNum) //4 (4*3 =12)
參考資料:MDN(點擊查看)
some():回傳boolean(True/False)
some()
的方法會對陣列中的每個元素執行執行一次 callback
函式,直到找到符合條件的元素後回傳True,並結束函式,若找完所有元素還是沒有符合條件的元素的話,則回傳False。
語法:var newArray = arr.some(callback(element[, index[, array]])[, thisArg]) 還是跟filter差不多的語法
那來看運用吧,就如同上面所說,當他找到第一個true值後,就會結束程式,也因此不會印出所有的index!
const nums = [1, 2, 3, 4, 5, 6]const even = nums.some(function(num, index){ console.log(index) // 會印出 0 和 1 return num % 2 == 0})console.log(even) // True
參考資料:MDN(點擊查看)
every():回傳boolean(True/False)
every()
和 some()回傳值都是布林值,但不同的是,every()一定要全部都是True才會回傳True,能想像成比較嚴格的some(),和some()很類似的點還有當every()找到第一個 False 就會回傳 False 了,也不會再繼續程式(因為繼續執行也不可能達到True)
語法:var newArray = arr.every(callback(element[, index[, array]])[, thisArg]) 還是跟filter差不多的語法
const even = nums.every(function(num, index){console.log(index) //只印出 0return num % 2 == 0})console.log(even) //False
參考資料:MDN(點擊查看)