PorównaniePorównania

map() vs forEach()

map() buduje nową tablicę z wyników funkcji, a forEach() tylko wywołuje funkcję dla każdego elementu i zawsze zwraca undefined.

Na tej stronie

Porównanie w tabeli

#

Przykład

#
JavaScript
const prices = [10, 20, 30]

const doubled = prices.map((price) => price * 2)
const result = prices.forEach((price) => console.log(price))

console.log(doubled)
console.log(result)
Konsola
10
20
30
[20, 40, 60]
undefined

Definicja i zastosowanie

#

Obie metody przechodzą po kolejnych elementach tablicy i dla każdego wywołują tę samą funkcję z argumentami (element, index, array). Różni je to, co dzieje się z wynikiem: map() zbiera wartości zwrócone przez funkcję w nową tablicę tej samej długości, a forEach() je ignoruje i zawsze zwraca undefined.

Wybór jest więc prosty. Gdy chcesz przekształcić dane i dalej korzystać z wyniku (ceny z podatkiem, lista imion, elementy listy w React), użyj map(). Gdy chcesz tylko wykonać efekt uboczny dla każdego elementu (wypisać go w konsoli, zapisać, zmienić element na stronie), użyj forEach().

Wydajność nie jest tu kryterium, bo w praktyce obie metody działają tak samo szybko. Liczy się czytelność: map(), której wyniku nikt nie używa, sugeruje pomyłkę, a forEach() z push() do osobnej tablicy to dłuższa wersja map().

Składnia

#
Składnia
const result = array.map((element, index, array) => newValue)
array.forEach((element, index, array) => { /* efekt uboczny */ })

Więcej przykładów

#
map() w łańcuchu metod
JavaScript
const students = [
  { name: 'Ania', points: 120 },
  { name: 'Kuba', points: 95 },
  { name: 'Ola', points: 140 }
]

const summary = students
  .map((student) => `${student.name}: ${student.points}`)
  .join(', ')

console.log(summary)
Konsola
Ania: 120, Kuba: 95, Ola: 140
forEach() z push() to dłuższa wersja map()
JavaScript
const names = ['ania', 'kuba']

const upperWithForEach = []
names.forEach((name) => upperWithForEach.push(name.toUpperCase()))

const upperWithMap = names.map((name) => name.toUpperCase())

console.log(upperWithForEach)
console.log(upperWithMap)
Konsola
['ANIA', 'KUBA']
['ANIA', 'KUBA']

Wynik jest ten sam, ale wersja z map() jest krótsza i nie wymaga pustej tablicy na start.

Gdy trzeba przerwać: for...of zamiast forEach()
JavaScript
const scores = [40, 75, 90, 20]

for (const score of scores) {
  if (score > 80) {
    console.log('Pierwszy wynik powyżej 80:', score)
    break
  }
}
Konsola
Pierwszy wynik powyżej 80: 90

Dobre praktyki

#
  • Jeśli nie używasz tablicy zwróconej przez map(), zamień ją na forEach() albo pętlę for...of.
  • Z await nie używaj forEach(): pętla nie czeka na obietnice. Sięgnij po for...of albo await Promise.all(array.map(...)).
  • Szukasz jednego elementu albo sprawdzasz warunek? find(), some() i every() kończą pracę wcześniej niż forEach().

Powiązane hasła

#

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