Содержание
Современный стандарт JavaScript предоставляет множество методов для «умного» перебора массивов. Среди наиболее популярных — forEach, for или for…of. Если же необходимо перебрать массив и вернуть данные для каждого элемента, подойдёт map.
В случае, когда нужно пройтись по массиву и, например, суммировать все значения, найти среднее или произвести какие-либо промежуточные действия, лучше использовать метод reduce.
В каких сценариях его можно применять — в этой статье.
Reduce сворачивает массив к одному значению (редуцирует). Этим значением может быть любой тип данных — как примитивный, так и составной, например, массив.
Метод принимает два аргумента:
- callback-функцию, выполняемую для запуска каждого элемента в массиве,
- начальное значение initialValue.
Callback также принимает два аргумента: accumulator, который возвращает функция callback после посещения очередного элемента, и текущий элемент в цикле currentValue.
Рассмотрим несколько неочевидных применений метода reduce, которые помогут придерживаться принципа write less, do more.
Минимальное и максимальное значение в массиве
Для того, чтобы найти минимальное и максимальное значение, можно использовать Math API, например:
const array = [-9, 18, 6, 5]; |
Но при использовании больших массивов (~10^7) можно столкнуться с ошибками. Исключить эти проблемы и при этом получить нужный результат можно с помощью метода reduce.
const array = [-9, 18, 6, 5]; |
Может потребоваться разобрать в URL адресе GET параметры и сложить их в объект.
const parseQuery = () => { // {name: "hello", title: "world"} |
Но с использованием метода reduce все становится понятнее и предсказуемее:
const parseQuery = () => { // {name: "hello", title: "world"} |
Вот как это работает:
1. Получаем search параметры из URL — https://somedomain.dev?name=hello&title=world
const search = url.search; // ?name=hello&title=world |
2. Удаляем лишние символы
search.replace(/(^\?)|(&$)/g, ""); |
3. Используем reduce, чтобы собрать параметры в объект.
Десериализация параметров
В этом примере ситуация противоположная. Если нужно к ссылке добавить набор параметров, то использовать конкатенацию (склеивание строк) не очень удобно, особенно если таких параметров десятки или сотни. Из-за этого сильно падает читаемость кода, размер строки растёт с каждыми новым параметром, что создает сложности для дальнейшей поддержки.
const searchObj = { name: "hello", title:"world"}; // many others parameters |
Поправить ситуацию можно с помощью метода reduce. Для начала пишем функцию:
const stringifySearch = (search = {}) => { |
Далее берем объект из ранее описанного примера и применим ее:
const searchObj = { name: "hello", title:"world"}; // many others parameters |
Теперь можно не переживать за то, что при изменении объекта последующий код не будет работать корректно.
Выбор уникальных элементов массива
Тут все просто: идем по массиву и ищем, есть ли уже в нем такое значение. Если нет, добавляем его, а если есть — идем дальше. Таким образом, на выходе будет массив только уникальных значений.
const someArray = [ 1, 2, 1, 2, -1, 10, 11 ] |
Определение количества одинаковых элементов массива
Чтобы получить количество каждого элемента в массиве, дополнительно используем Map — это коллекция ключ-значение, как и Object.
Основное отличие в том, что в Map мы сможем работать с массивом, в котором используются значения разных типов (числа/строки).
const count = (array) => { |
Получение нескольких свойств объекта
Подобный сценарий довольно часто возникает в повседневной работе. Давайте посмотрим пример.
У нас есть объект с множеством свойств:
const obj = { |
Мы хотим получить некоторые свойства предыдущего объекта и создать новый:
const newObj = { |
Кажется, так делать не очень эффективно, не правда ли?
Напишем небольшой хелпер, который упростит нам решение проблемы:
const getObjectKeys = (obj = {}, keys = []) => { |
Ну и, конечно, проверим, как все это работает:
const obj = { |
Это лишь часть возможных сценариев применения метода в
повседневных задачах. Надеюсь, вы нашли для себя что-то интересное.
Благодарю за внимание и happy coding!
Опубликовано на Tproger