ForEach: примеры (JAVASCRIPT)

Использование метода forEach в JavaScript: практические примеры
Раздел: Массивы, Итерация
forEach(callback: function, thisArg?: any): undefined

Основы метода forEach

Метод forEach в JavaScript предназначен для выполнения предоставленной функции один раз для каждого элемента массива. Он используется, когда необходимо выполнить операцию над каждым элементом коллекции без создания нового массива.

Синтаксис метода: array.forEach(callback(currentValue, index, array), thisArg)

Параметры callback-функции:

  • currentValue - текущий обрабатываемый элемент массива
  • index (необязательный) - индекс текущего элемента
  • array (необязательный) - массив, по которому осуществляется проход

Параметр thisArg (необязательный) - значение, используемое в качестве this при выполнении функции обратного вызова.

Метод возвращает undefined и не изменяет исходный массив, хотя callback-функция может изменять элементы массива.

Примеры использования forEach

Базовый пример с выводом элементов:

const fruits = ['яблоко', 'банан', 'апельсин'];
fruits.forEach(item => console.log(item));
яблоко
банан
апельсин

Использование всех параметров callback-функции:

const numbers = [10, 20, 30];
numbers.forEach((value, index, array) => {
  console.log(`Элемент ${value} с индексом ${index} в массиве [${array}]`);
});
Элемент 10 с индексом 0 в массиве [10,20,30]
Элемент 20 с индексом 1 в массиве [10,20,30]
Элемент 30 с индексом 2 в массиве [10,20,30]

Использование параметра thisArg:

function Counter() {
  this.sum = 0;
  this.count = 0;
}

Counter.prototype.add = function(array) {
  array.forEach(function(element) {
    this.sum += element;
    this.count++;
  }, this);
};

const obj = new Counter();
obj.add([1, 2, 3]);
console.log(obj.sum, obj.count);
6 3

Альтернативные методы в JavaScript

map() - создает новый массив с результатами вызова функции для каждого элемента. Используется, когда нужно трансформировать данные.

filter() - создает новый массив со всеми элементами, прошедшими проверку. Подходит для фильтрации данных.

reduce() - выполняет функцию-редьюсер для каждого элемента, возвращая одно результирующее значение. Применяется для агрегации данных.

for...of - цикл для перебора итерируемых объектов. Предпочтительнее, когда нужен контроль над процессом итерации или требуется прервать выполнение.

for - классический цикл. Используется при работе с индексами или когда нужна максимальная производительность.

Типичные ошибки

Попытка прервать выполнение forEach:

const arr = [1, 2, 3, 4];
arr.forEach(item => {
  if (item === 3) return; // Не прерывает выполнение
  console.log(item);
});
1
2
4

Изменение массива во время итерации:

const numbers = [1, 2, 3];
numbers.forEach((num, index) => {
  numbers.push(num * 2); // Бесконечный цикл
  if (index > 5) return;
});

Использование асинхронных функций без учета их асинхронности:

const urls = ['url1', 'url2', 'url3'];
let results = [];
urls.forEach(async url => {
  const data = await fetch(url);
  results.push(data); // Порядок может нарушиться
});

Изменения в последних версиях

В ECMAScript 2023 добавлен метод findLast() и findLastIndex() для обратного поиска, но forEach остался без изменений.

Основные изменения касаются производительности и оптимизации в движках JavaScript. Современные браузеры лучше оптимизируют forEach для больших массивов.

В строгом режиме ES5 и выше, значение this в callback-функции соответствует переданному thisArg или undefined в обычном режиме.

Расширенные примеры

Работа с массивами объектов:

Пример javascript
const users = [
  {id: 1, name: 'Анна', active: true},
  {id: 2, name: 'Иван', active: false},
  {id: 3, name: 'Мария', active: true}
];

users.forEach((user, index, arr) => {
  if (user.active) {
    console.log(`${user.name} активен(а)`);
  }
});
Анна активен(а)
Мария активен(а)

Использование forEach с NodeList:

Пример javascript
// Получение всех элементов на странице
const divs = document.querySelectorAll('div');
divs.forEach(div => {
  div.style.color = 'blue';
});

Параллельная обработка нескольких массивов:

Пример javascript
const keys = ['name', 'age', 'city'];
const values = ['Алексей', 30, 'Москва'];
const obj = {};

keys.forEach((key, index) => {
  obj[key] = values[index];
});

console.log(obj);
{name: 'Алексей', age: 30, city: 'Москва'}

Имитация метода map с использованием forEach:

Пример javascript
const numbers = [1, 2, 3];
const doubled = [];
numbers.forEach(num => {
  doubled.push(num * 2);
});
console.log(doubled);
[2, 4, 6]

Аналоги в других языках программирования

В Python используется comprehensions и функция map():

# Python
numbers = [1, 2, 3]
# Списочное выражение
squares = [x**2 for x in numbers]
# Функция map с lambda
result = list(map(lambda x: x*2, numbers))
squares = [1, 4, 9]
result = [2, 4, 6]

В PHP применяется конструкция foreach:

// PHP
$array = [1, 2, 3];
foreach ($array as $value) {
    echo $value * 2;
}
// С ключами
foreach ($array as $key => $value) {
    echo "$key: $value";
}

В C# используется метод ForEach для коллекций:

// C#
List numbers = new List {1, 2, 3};
numbers.ForEach(n => Console.WriteLine(n));

Основное отличие JavaScript forEach - невозможность прервать выполнение с помощью break или return.

JS forEach function comments

En
ForEach Executes a provided function once for each array element.