JavaScript известен своими многочисленными выдающимися особенностями, одна из которых, конечно же, не в переизбытке методов в его стандартной библиотеке. Одним из исключений из этого правила являются методы в прототипе объекта Array - JavaScript предоставляет все необходимое для обработки данных. Посмотрим, что нас ждет!

для каждого

Это, наверное, самый простой встроенный метод и первый, который все начинают использовать. Проще говоря, он делает то же самое, что и цикл for, но с меньшей производительностью. Это может обеспечить дополнительную удобочитаемость (но не бесплатно - for loop, как правило, более эффективно). Давайте рассмотрим следующий пример, предполагая, что someFunction - это функция, которая принимает один number и выполняет какой-то побочный эффект:

Его можно заменить на:

Поскольку это делается не в for loop, а в обратном вызове, передаваемом методу, удобочитаемость можно еще больше повысить:

Но внимательный читатель заметит, что что-то не так в последнем примере - кажется, что в функции обратного вызова происходит слишком много всего. Это лучший способ сделать это? Конечно, нет. Это приводит нас прямо к другому методу в списке, который называется

фильтр

Как это может нам сейчас помочь? Посмотрим:

Такой подход дает очевидное преимущество - обратный вызов, использованный в последнем примере, разделен на две атомарные функции. Фактически, вторая функция (callSomeFunction) - это немодифицированная функция, импортированная из другого модуля, что делает ее намного проще и удобочитаемой.

Как filter работает? Он выполняет итерацию по массиву и возвращает новый массив, заполненный только теми элементами, для которых обратный вызов, переданный в filter, возвращает истинное значение.

Как упоминалось в начале, все примеры, показывающие использование метода forEach, предполагали, что данные будут использоваться для выполнения некоторого побочного эффекта. Но что, если нам просто нужно преобразование данных? Первый метод, безусловно,

карта

Как это работает? Он принимает функцию обратного вызова и возвращает новый массив того же размера (всегда), что и исходный массив, и каждый из элементов является элементом исходного массива из та же позиция, но со значением, измененным функцией обратного вызова. Уф, это звучит сложно, но на самом деле это не так. Допустим, нам нужно добавить по семь к каждому из элементов массива. Сначала попробуем сделать это с помощью for loop:

То же самое можно сделать с помощью map:

Это более лаконично и читабельно, и это всего лишь одно преобразование! Легко представить себе вариант использования, состоящий из нескольких шагов:

В этом примере каждый из элементов массива ослабляется до 150, если он выше, затем до 50, если он ниже, а затем все результирующие элементы умножаются на 1,2. Выполнение этих преобразований в последовательности стало возможным благодаря тому факту, что map возвращает экземпляр объекта Array, который, в свою очередь, позволяет создавать цепочки методов, что может быть особенно полезно при использовании различных встроенных методов:

Во всех примерах в этом разделе предполагается, что при преобразовании элементов массива возвращаемый массив имеет то же количество элементов, что и исходный - в самых основных случаях использования map преобразует элементы в своего рода изоляции. Это не всегда возможно из-за требований, и если эту изоляцию необходимо нарушить, лучший способ сделать это называется

уменьшать

Это крем-де-ла-крем, швейцарский армейский нож встроенных методов - Array.prototype.reduce. Для Array методов это почти то же самое, что NAND для логических операций - большинство встроенных методов можно переопределить с помощью reduce. map? Легкий. find? Без усилий. every, includes, flatMap? Все это (и многое другое) можно реализовать с помощью reduce - вопрос только в том, нужно ли это делать? Последний пример может быть легко реализован с помощью. Наиболее частая проблема, с которой я сталкиваюсь, люди с reduce не знают, когда ее правильно использовать.

Рассмотрим последний пример с фильтрацией ИТ-специалистов:

Это не так уж и плохо, но подход с использованием цепочки (по крайней мере, на мой взгляд) более читабелен, особенно если обратные вызовы, используемые для фильтра и карт, хранятся в вспомогательных файлах области проекта.

Основное практическое правило здесь: если вы когда-нибудь захотите объявить временную переменную и изменить ее значение внутри цикла for в зависимости от длины некоторого массива, вам, вероятно, следует использовать reduce. Давайте рассмотрим наиболее распространенное использование reduce— суммирование содержимого массива. Вместо:

того же можно добиться с помощью:

Что здесь случилось? reduce принимает два параметра. Первая - это функция, которая будет использоваться для итерации по массиву и передачи результата следующей итерации, вторая - это начальное значение результата, которое наиболее интуитивно представляет собой число, но также может быть строкой, или массив или объект. Рассмотрим следующий пример:

Или следующий:

reduce определенно нужно приложить некоторые усилия, чтобы осознать это, но это определенно стоит попробовать - только посмотрите, насколько это мощно!

На этом сегодня все закончилось, спасибо, что дочитали до этого места! Также - какой ваш любимый встроенный Array метод? Дай мне знать в комментариях!