Массив: перебирающие методы
Материал на этой странице устарел, поэтому скрыт из оглавления сайта.
Более новая информация по этой теме находится на странице https://learn.javascript.ru/array-methods.
Современный стандарт JavaScript предоставляет много методов для «умного» перебора массивов, которые есть в современных браузерах…
…Ну а для их поддержки в IE8- просто подключите библиотеку ES5-shim.
forEach
Метод «arr.forEach(callback[, thisArg])» используется для перебора массива.
Он для каждого элемента массива вызывает функцию callback .
Этой функции он передаёт три параметра callback(item, i, arr) :
- item – очередной элемент массива.
- i – его номер.
- arr – массив, который перебирается.
Второй, необязательный аргумент forEach позволяет указать контекст this для callback . Мы обсудим его в деталях чуть позже, сейчас он нам не важен.
Метод forEach ничего не возвращает, его используют только для перебора, как более «элегантный» вариант, чем обычный цикл for .
filter
Метод «arr.filter(callback[, thisArg])» используется для фильтрации массива через функцию.
Он создаёт новый массив, в который войдут только те элементы arr , для которых вызов callback(item, i, arr) возвратит true .
Метод «arr.map(callback[, thisArg])» используется для трансформации массива.
Он создаёт новый массив, который будет состоять из результатов вызова callback(item, i, arr) для каждого элемента arr .
every/some
Эти методы используются для проверки массива.
- Метод «arr.every(callback[, thisArg])» возвращает true , если вызов callback вернёт true для каждого элемента arr .
- Метод «arr.some(callback[, thisArg])» возвращает true , если вызов callback вернёт true для какого-нибудь элемента arr .
reduce/reduceRight
Метод «arr.reduce(callback[, initialValue])» используется для последовательной обработки каждого элемента массива с сохранением промежуточного результата.
Это один из самых сложных методов для работы с массивами. Но его стоит освоить, потому что временами с его помощью можно в несколько строк решить задачу, которая иначе потребовала бы в разы больше места и времени.
Метод reduce используется для вычисления на основе массива какого-либо единого значения, иначе говорят «для свёртки массива». Чуть далее мы разберём пример для вычисления суммы.
Он применяет функцию callback по очереди к каждому элементу массива слева направо, сохраняя при этом промежуточный результат.
Аргументы функции callback(previousValue, currentItem, index, arr) :
- previousValue – последний результат вызова функции, он же «промежуточный результат».
- currentItem – текущий элемент массива, элементы перебираются по очереди слева-направо.
- index – номер текущего элемента.
- arr – обрабатываемый массив.
Кроме callback , методу можно передать «начальное значение» – аргумент initialValue . Если он есть, то на первом вызове значение previousValue будет равно initialValue , а если у reduce нет второго аргумента, то оно равно первому элементу массива, а перебор начинается со второго.
Проще всего понять работу метода reduce на примере.
Например, в качестве «свёртки» мы хотим получить сумму всех элементов массива.
Вот решение в одну строку:
Разберём, что в нём происходит.
При первом запуске sum – исходное значение, с которого начинаются вычисления, равно нулю (второй аргумент reduce ).
Сначала анонимная функция вызывается с этим начальным значением и первым элементом массива, результат запоминается и передаётся в следующий вызов, уже со вторым аргументом массива, затем новое значение участвует в вычислениях с третьим аргументом и так далее.
Поток вычислений получается такой
В виде таблицы где каждая строка – вызов функции на очередном элементе массива:
sum | current | результат | |
---|---|---|---|
первый вызов | 0 | 1 | 1 |
второй вызов | 1 | 2 | 3 |
третий вызов | 3 | 3 | 6 |
четвёртый вызов | 6 | 4 | 10 |
пятый вызов | 10 | 5 | 15 |
Как видно, результат предыдущего вызова передаётся в первый аргумент следующего.
Кстати, полный набор аргументов функции для reduce включает в себя function(sum, current, i, array) , то есть номер текущего вызова i и весь массив arr , но здесь в них нет нужды.
Посмотрим, что будет, если не указать initialValue в вызове arr.reduce :
Результат – точно такой же! Это потому, что при отсутствии initialValue в качестве первого значения берётся первый элемент массива, а перебор стартует со второго.
Таблица вычислений будет такая же, за вычетом первой строки.
Метод arr.reduceRight работает аналогично, но идёт по массиву справа-налево.
Итого
Мы рассмотрели методы:
- forEach – для перебора массива.
- filter – для фильтрации массива.
- every/some – для проверки массива.
- map – для трансформации массива в массив.
- reduce/reduceRight – для прохода по массиву с вычислением значения.
Во многих ситуациях их использование позволяет написать код короче и понятнее, чем обычный перебор через for .
Задачи
Перепишите цикл через map
Код ниже получает из массива строк новый массив, содержащий их длины:
Перепишите выделенный участок: уберите цикл, используйте вместо него метод map .
Алгоритм JavaScript: Array.forEach()
Метод forEach() выполняет функцию обратного вызова для каждого элемента в массиве. Что это значит? Метод forEach вызывает функцию, находящуюся вне forEach и имеющую дело с итерацией для проверяемого массива. Присмотримся к тому, как это на самом деле происходит. 1 случай:
forEach: функция обратного вызова
Здесь мы имеем дело с массивом flowers . Каждый элемент в массиве представляет собой строки с названиями цветов.
Напишем теперь функцию обратного вызова с аргументами по умолчанию each element (каждый элемент), index (индекс) и original array (исходный массив). С этой функцией можно делать что угодно. Мы регистрируем ее в журнале консоли. 2 случай:
Затем метод forEach выполнит функцию обратного вызова:
forEach: встроенная функция обратного вызова
Здесь происходит то же самое, что и в первом случае — метод forEach выполняет функцию обратного вызова, но только уже в одной строке.
forEach: стрелочная функция
В этом случае задействована анонимная стрелочная функция, которая чаще всего и используется. Все эти три метода forEach выведут одно и то же (не забывайте, что возвращаемые методом .forEach значения являются undefined , т. е. неопределенными):
Попрактикуемся с более сложными алгоритмами.
В саду несколько цветков. Каких цветков в саду всего два?
Здесь у нас структура массива, состоящего из строк с названиями цветов. Перебираем массив, используя метод forEach . Для каждого названия цветка увеличиваем счетчик, если этот цветок существует в объекте count (пара «ключ-значение»). А если цветка нет, устанавливаем значение на 1 . Затем отдельно от этой итерации проводим итерацию по созданному нами объекту и находим, каких цветков всего два.
Отметим, что объект этот — count и объявлен он вне итерации .forEach .
forEach не допускает объявления переменной внутри цикла. Также нельзя использовать оператор if и возвращать значение внутри метода forEach иначе, кроме как объявлять переменную вне итерации forEach и затем возвращать вне или проводить манипуляции с этими данными.
Посмотрите на следующий вопрос из StackOverflow и попробуйте найти ответ:
Array.prototype.forEach()
Метод forEach() выполняет указанную функцию один раз для каждого элемента в массиве.
Интерактивный пример
Синтаксис
Параметры
Функция, которая будет вызвана для каждого элемента массива. Она принимает от одного до трёх аргументов:
Текущий обрабатываемый элемент в массиве.
Индекс текущего обрабатываемого элемента в массиве.
Массив, по которому осуществляется проход.
Необязательный параметр. Значение, используемое в качестве this при вызове функции callback .
Возвращаемое значение
Описание
Метод forEach() выполняет функцию callback один раз для каждого элемента, находящегося в массиве в порядке возрастания. Она не будет вызвана для удалённых или пропущенных элементов массива. Однако, она будет вызвана для элементов, которые присутствуют в массиве и имеют значение undefined .
Функция callback будет вызвана с тремя аргументами:
- значение элемента (value)
- индекс элемента (index)
- массив, по которому осуществляется проход (array)
Если в метод forEach() был передан параметр thisArg , при вызове callback он будет использоваться в качестве значения this . В противном случае, в качестве значения this будет использоваться значение undefined . В конечном итоге, значение this , наблюдаемое из функции callback , определяется согласно обычным правилам определения this , видимого из функции .
Диапазон элементов, обрабатываемых методом forEach() , устанавливается до первого вызова функции callback . Элементы, добавленные в массив после начала выполнения метода forEach() , не будут посещены функцией callback . Если существующие элементы массива изменятся, значения, переданные в функцию callback , будут значениями на тот момент времени, когда метод forEach() посетит их; удалённые элементы посещены не будут. Если уже посещённые элементы удаляются во время итерации (например, с помощью shift() ), последующие элементы будут пропущены. ( Смотри пример ниже )
Примечание: Не существует способа остановить или прервать цикл forEach() кроме как выбрасыванием исключения. Если вам необходимо такое поведение, метод forEach() неправильный выбор.
Досрочное прекращение может быть достигнуто с:
- Простой цикл for
- Циклы for. of / for. in
Если нужно протестировать элементы массива на условие и нужно вернуть булево значение, вы можете воспользоваться методами every() , some() , find() или findIndex() .
Метод forEach() выполняет функцию callback один раз для каждого элемента массива; в отличие от методов every() и some() , он всегда возвращает значение undefined .
JavaScript forEach()
In this tutorial, you will learn about JavaScript forEach() method with the help of examples.
The forEach() method calls a function and iterates over the elements of an array. The forEach() method can also be used on Maps and Sets.
JavaScript forEach
The syntax of the forEach() method is:
- function(currentValue, index, arr) — a function to be run for each element of an array
- currentValue — the value of an array
- index (optional) — the index of the current element
arr (optional) — the array of the current elements
forEach with Arrays
The forEach() method is used to iterate over an array. For example,
Output
In the above program, the forEach() method takes myFunction() function that displays each element of a students array.
Updating the Array Elements
As we have seen in the above example, the forEach() method is used to iterate over an array, it is quite simple to update the array elements. For example,
Output
forEach with Arrow Function
You can use the arrow function with the forEach() method to write a program. For example,
Output
for loop to forEach()
Here is an example of how we can write a program with for loop and with forEach() .
Using for loop
Output
Using forEach()
for. of with Sets
You can iterate through the Set elements using the forEach() method. For example,
Output
forEach with Maps
You can iterate through the Map elements using the forEach() method. For example,