【JavaScript】filter() / find() / some() / every()

Tina
5 min readApr 13, 2021

--

這些方法差在哪?什麼時候應該用

當要尋找 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(點擊查看)

--

--

Tina
Tina

Written by Tina

前端工程師 Mix 數位行銷人

No responses yet