JS метод Array.forEach()
Опис
Метод forEach() є частиною багатьох інших ітераційних методів у JavaScript. Основна його особливість полягає в тому, що він викликає функцію callbackFn для кожного елемента масиву за порядком індексів. Важливо зазначити, що, на відміну від методу map(), forEach() завжди повертає undefined, тому ланцюжкові виклики тут не доречні.
Функція callbackFn активується лише для тих індексів масиву, що мають призначені значення. Отже, пусті слоти в розріджених масивах будуть проігноровані.
Що стосується forEach(), він не модифікує масив, на якому застосовується. Однак функція callbackFn може це робити. Слід звертати увагу на такі моменти:
callbackFnне буде працювати з елементами, доданими після початку виконанняforEach().- Зміни, внесені до вже опрацьованих індексів, не викликатимуть повторного виклику
callbackFnдля них. - Якщо певний елемент масиву, який ще не був опрацьований, змінюється за допомогою
callbackFn, його стан на момент опрацьовування буде передано вcallbackFn. Елементи, що були видалені, опрацьовуватися не будуть.
Приклад:
const fruits = ['apple', 'banana', 'cherry'];
fruits.forEach(fruit => {
console.log(fruit);
});
В цьому прикладі ми ітеруємо по масиву fruits та виводимо кожний його елемент на консоль за допомогою методу forEach().
Немає способу зупинити або прервати цикл forEach() окрім виняткового стану. Якщо ви шукаєте таку можливість, розгляньте використання циклів for, for...of чи for...in. Методи масиву every(), some(), find() та findIndex() також надають можливість припинення ітерації.
Зверніть увагу: forEach() працює лише з синхронними функціями. Цей метод не чекає на виконання обіцянок (promises). Тому будьте обережні, коли використовуєте обіцянки або асинхронні функції як callback для forEach.
| Нотатка: | Пам'ятайте, що метод |
| Нотатка: | Метод |
Синтаксис
forEach(callbackFn)
forEach(callbackFn, thisArg)
Параметри
- *
callbackFn Функція, яка виконується для кожного елемента масиву. Значення, яке вона повертає, не використовується.
Функція
callbackFnвикликається з наступними аргументами:element: поточний елемент, який обробляється у масиві;index: індекс поточного елемента, який обробляється у масиві;array: масив, на якому було викликано методfind().
thisArgЗначення, яке використовується як
thisпід час виконання функціїcallbackFn.
Return
undefinedМетод не повертає жодного значення.
Переглядачі
| Переглядач | |||||
|---|---|---|---|---|---|
1 |
1.5 |
3 |
9.5 |
12 |
| Переглядач | ||||
|---|---|---|---|---|
37 |
18 |
4 |
1 |
| Переглядач | ||
|---|---|---|
0.10.0 |
1.0 |
Приклади
Приклад використовує метод forEach() для масиву array1. Він перебирає кожен елемент масиву та виводить його у консоль. Крім того, результат роботи методу forEach() виводиться на сторінку.
Використання forEach() на розріджених масивах.
const arraySparse = [1, 3, /* пусто */, 7];
let numCallbackRuns = 0;
arraySparse.forEach((element) => {
console.log({ element });
numCallbackRuns++;
});
console.log({ numCallbackRuns });
// { element: 1 }
// { element: 3 }
// { element: 7 }
// { numCallbackRuns: 3 }
Перетворення циклу for на forEach().
// Перетворення циклу for на forEach
const items = ["item1", "item2", "item3"];
const copyItems = [];
// Початковий варіант
for (let i = 0; i < items.length; i++) {
copyItems.push(items[i]);
}
// Перетворений варіант
items.forEach((item) => {
copyItems.push(item);
});
Зміна масиву під час ітерації.
// Зміна масиву під час ітерації
const words = ["one", "two", "three", "four"];
words.forEach((word) => {
console.log(word);
if (word === "two") {
words.shift(); //'one' буде видалено з масиву
}
}); // one // two // four
console.log(words); // ['two', 'three', 'four']
Виклик forEach() на об'єктах, які не є масивами. Метод forEach() читає властивість length об'єкта this і потім отримує доступ до кожної властивості з ключем, що є не від'ємним цілим числом меншим за length.
// Виклик forEach() на об'єктах, які не є масивами
const arrayLike = {
length: 3,
0: 2,
1: 3,
2: 4,
3: 5, // ігнорується forEach(), оскільки length дорівнює 3
};
Array.prototype.forEach.call(arrayLike, (x) => console.log(x));
// 2
// 3
// 4
