0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Рассмотрим следующую задачу. Возьмём список пользователей и извлечём из него имена всех пользователей:</p>
1
<p>Рассмотрим следующую задачу. Возьмём список пользователей и извлечём из него имена всех пользователей:</p>
2
<p>Здесь мы видим обычную агрегацию с использованием цикла<em>for...of</em>. А что, если нам понадобится извлечь возраст? Повторяем:</p>
2
<p>Здесь мы видим обычную агрегацию с использованием цикла<em>for...of</em>. А что, если нам понадобится извлечь возраст? Повторяем:</p>
3
<p>В примерах выше легко увидеть закономерность. Выполняется один и тот же проход по циклу, и результат собирается в массив result. Единственное, что меняется - значение, которое мы извлекаем из элементов исходного массива.</p>
3
<p>В примерах выше легко увидеть закономерность. Выполняется один и тот же проход по циклу, и результат собирается в массив result. Единственное, что меняется - значение, которое мы извлекаем из элементов исходного массива.</p>
4
<p>Операция, которую мы выполняли в обеих ситуациях, называется<strong>отображением</strong>(mapping). В коде мы взяли исходный массив и отобразили его в другой массив, попутно выполнив необходимые преобразования над каждым элементом. Важно, что размер получившегося массива равен размеру исходного массива.</p>
4
<p>Операция, которую мы выполняли в обеих ситуациях, называется<strong>отображением</strong>(mapping). В коде мы взяли исходный массив и отобразили его в другой массив, попутно выполнив необходимые преобразования над каждым элементом. Важно, что размер получившегося массива равен размеру исходного массива.</p>
5
<p>Задача отображать данные в реальном коде встречается буквально на каждом шагу. Это настолько важная операция, что для нее создана специальная функция высшего порядка<a>map()</a>:</p>
5
<p>Задача отображать данные в реальном коде встречается буквально на каждом шагу. Это настолько важная операция, что для нее создана специальная функция высшего порядка<a>map()</a>:</p>
6
<p>Метод map() принимает первым параметром функцию. Дальше, внутри себя, map() перебирает элементы переданной коллекции и для каждого элемента вызывает переданную функцию. На вход этой функции передаётся элемент исходного массива, а её результат записывается в новый массив, который и возвращается наружу.</p>
6
<p>Метод map() принимает первым параметром функцию. Дальше, внутри себя, map() перебирает элементы переданной коллекции и для каждого элемента вызывает переданную функцию. На вход этой функции передаётся элемент исходного массива, а её результат записывается в новый массив, который и возвращается наружу.</p>
7
<p>Сравните решение задачи получения списка имен через цикл и с помощью метода map(). Последний имеет довольно много преимуществ. Во-первых, код с ним значительно короче. Во-вторых, от нас скрыта повторяющаяся логика перебора. Больше не нужно явно определять цикл и выполнять руками все те операции, которые можно не выполнять. Метод map() позволяет сосредоточиться на сути происходящего, скрывая ненужные детали (проход по циклу).</p>
7
<p>Сравните решение задачи получения списка имен через цикл и с помощью метода map(). Последний имеет довольно много преимуществ. Во-первых, код с ним значительно короче. Во-вторых, от нас скрыта повторяющаяся логика перебора. Больше не нужно явно определять цикл и выполнять руками все те операции, которые можно не выполнять. Метод map() позволяет сосредоточиться на сути происходящего, скрывая ненужные детали (проход по циклу).</p>
8
<p>Типичный пример, который любят приводить в документации к функции map() разных языков программирования - применение некоторой арифметической операции к каждому элементу коллекции:</p>
8
<p>Типичный пример, который любят приводить в документации к функции map() разных языков программирования - применение некоторой арифметической операции к каждому элементу коллекции:</p>
9
<p>Пример выглядит искусственно, но хорошо отражает суть операции.</p>
9
<p>Пример выглядит искусственно, но хорошо отражает суть операции.</p>
10
<h2>Реализация</h2>
10
<h2>Реализация</h2>
11
<p>Напишем свою собственную функцию myMap(), работающую аналогично методу массива map():</p>
11
<p>Напишем свою собственную функцию myMap(), работающую аналогично методу массива map():</p>
12
<p>Главное отличие кода функции myMap() (и метода map()) от ручного обхода массива заключается в том, что функция myMap() не знает, что нужно сделать с каждым элементом массива. Поэтому она принимает вторым аргументом функцию, которую вызывает для каждого элемента исходного массива, а результат вызова записывается в выходной массив. Чем будет этот результат - функция myMap() не знает, и ей этого знать не нужно. Ответственность за обработку лежит на пользователях.</p>
12
<p>Главное отличие кода функции myMap() (и метода map()) от ручного обхода массива заключается в том, что функция myMap() не знает, что нужно сделать с каждым элементом массива. Поэтому она принимает вторым аргументом функцию, которую вызывает для каждого элемента исходного массива, а результат вызова записывается в выходной массив. Чем будет этот результат - функция myMap() не знает, и ей этого знать не нужно. Ответственность за обработку лежит на пользователях.</p>