PorównaniePorównania

find() vs filter()

find() zwraca pierwszy element spełniający warunek albo undefined, a filter() zwraca nową tablicę ze wszystkimi elementami, które przeszły test.

Na tej stronie

Porównanie w tabeli

#

Przykład

#
JavaScript
const users = [
  { id: 1, name: 'Ania', active: true },
  { id: 2, name: 'Kuba', active: false },
  { id: 3, name: 'Ola', active: true }
]

const oneUser = users.find((user) => user.active)
const activeUsers = users.filter((user) => user.active)

console.log(oneUser)
console.log(activeUsers)
Konsola
{ id: 1, name: 'Ania', active: true }
[{ id: 1, name: 'Ania', active: true }, { id: 3, name: 'Ola', active: true }]

Definicja i zastosowanie

#

Obie metody sprawdzają elementy tablicy tą samą funkcją testującą (element, index, array) i nie zmieniają oryginału. Różnią się tym, co robią z wynikiem testu: find() zatrzymuje się na pierwszym elemencie, dla którego funkcja zwróci wartość prawdziwą, a filter() sprawdza wszystkie elementy i zbiera je w nową tablicę.

find() zwraca sam element albo undefined, gdy żaden nie pasuje. filter() zawsze zwraca tablicę, nawet pustą [], więc wynik można od razu dalej mapować albo zliczyć przez .length. Dzięki temu, że find() kończy pracę na pierwszym trafieniu, bywa szybsze na dużych tablicach niż filter(), które zawsze przechodzi przez wszystkie elementy.

Wybór zależy od tego, ile elementów potrzebujesz. Szukasz jednego konkretnego rekordu, na przykład użytkownika po id? Użyj find(). Potrzebujesz listy elementów spełniających warunek, na przykład aktywnych użytkowników do wyświetlenia? Użyj filter().

Składnia

#
Składnia
array.find(callbackFn)
array.filter(callbackFn)

Więcej przykładów

#
Bezpieczny odczyt po find()
JavaScript
const products = [
  { slug: 'html', price: 0 },
  { slug: 'react', price: 199 }
]

const missing = products.find((product) => product.slug === 'vue')
const free = products.filter((product) => product.price === 0)

console.log(missing)
console.log(free.length)
console.log(missing?.price ?? 'Brak produktu')
Konsola
undefined
1
Brak produktu
find() sprawdza mniej elementów niż filter()
JavaScript
const numbers = [1, 2, 3, 4, 5]

const checkedByFind = []
numbers.find((number) => {
  checkedByFind.push(number)
  return number > 2
})

const checkedByFilter = []
numbers.filter((number) => {
  checkedByFilter.push(number)
  return number > 2
})

console.log(checkedByFind)
console.log(checkedByFilter)
Konsola
[1, 2, 3]
[1, 2, 3, 4, 5]

find() zatrzymuje się po trafieniu na 3 i nie sprawdza już 4 i 5. filter() zawsze przechodzi przez całą tablicę.

Dobre praktyki

#
  • Wynik find() może być undefined. Zabezpiecz odczyt jego właściwości operatorem ?..
  • Sprawdzasz tylko, czy element istnieje, bez potrzeby go używać? some() jest czytelniejsze niż porównanie wyniku find() do undefined.
  • Gdy potrzebujesz pozycji pasującego elementu, a nie jego wartości, użyj findIndex().

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.