Метод reduce () не возвращает массив, он работает иначе, чем другие методы.
Мы используем reduce (), когда нам нужно проанализировать все элементы в массиве и вернуть только одно значение, оно может преобразовать данные из массива в число, строку или объект.
Функция редуктора всегда берет из двух элементов (аккумулятор и текущее значение), уменьшая их до одного значения. То, что мы объединяем элемент за элементом, - это аккумулятор, и результат этой комбинации используется со следующим элементом для объединения этих двух в один.
Давай попробуем метод сокращения с двумя упражнениями?
Первое упражнение (яблочное тесто)
Вот история, которую я придумал:
Человек (мужчина или женщина) входит в старомодную пекарню, человек сразу же чувствует запах корицы и думает, что яблочное тесто (эй, это правда, яблоко и корица идеально подходят), но он не знает, сколько пирожных сделано с яблоки, он спрашивает продавца, сколько вкусных продуктов делают из яблок? Продавец поворачивается к полке и видит следующие товары:
Теперь давайте поможем продавцу подсчитать общую сумму яблочного теста методом уменьшения:
Если мы console.log (яблоки), мы получим номер 3. Что здесь произошло?
Сначала мы устанавливаем reduce () для массива в указанном нами условии, чтобы вернуть аккумулятор и увеличить его на единицу только в том случае, если слово «яблоко» существует в любой из строк.
Обратите внимание на 0 (ноль) перед закрытием функции? Это начальное значение аккумулятора. Это необязательно, если мы ничего не устанавливаем, тогда значение всегда будет первым отсчетом.
Аккумулятор равен 0, он находит строку «яблочный пирог», и значение 1 сохраняется в аккумуляторе, хорошо, теперь аккумулятор равен 1. Он идет снова и находит строку «яблочный пирог», поэтому теперь аккумулятор равен 2. , снова находит «яблочную крошку» и теперь аккумулятор равен 3.
Хорошо, хорошо, можно сказать, что мы можем добиться того же с помощью цикла for, но что, если в будущем мы захотим узнать общую стоимость всех яблочных пирожных? Если у нас есть массив всех цен, но вы хотите получить одно значение или общую сумму всех цен?
На этот раз результат будет другим, посмотрим, как будет храниться в аккумуляторе?
Давайте напишем:
Если мы консольным журналом, мы получим в общей сложности 39, как же так?
- Вначале аккумулятор равен 0 (начальное значение установлено на 0).
- Обратный вызов начинается для каждого элемента и суммирует аккумулятор с первым элементом в массиве, 0 + 1 = 1, поэтому теперь аккумулятор равен 1.
- Опять же, он выполняет обратный вызов и суммирует со вторым элементом в массиве 1 + 3, теперь аккумулятор равен 4.
- Снова идет и суммируется с третьим элементом 4 + 5 = 9,
- С четвертым элементом суммы 9 + 10 = 19.
- В итоге суммируем с последним элементом 19 + 20 = 39.
Надеюсь, это прояснилось и имеет смысл, давайте продолжим еще одно упражнение.
Второе упражнение (два к одному)
Возьмите 2 строки s1
и s2
, включая только буквы от a
до z
. Вернуть новую отсортированную строку, максимально длинную, содержащую отдельные буквы, каждая из которых взята только один раз - исходящая из s1 или s2.
Примеры конечного результата ниже:
Честно говоря, это можно решить разными способами. Но давайте попробуем использовать reduce()
. Для меня это прекрасный пример того, как привести в действие сокращение, давайте сделаем это.
Во-первых, что такое разные буквы?
Отдельной буквой считается буква, которая не равна ни одной букве в наборе. Например, в слове «банан» буквы b, a, n - это разные буквы. Скажем, отдельная буква - это, по сути, уникальная буква.
Решение:
Давайте разберем это:
Мы создаем функцию самая длинная, которая сохранит логику, мы создаем переменную allLetters
, которая суммирует обе строки, с помощью встроенного метода split()
мы устанавливаем каждую букву суммы в массив, в основном мы создаем новый массив. Помните, что для reduce()
нам нужен массив и доступ к нему.
distinctLetters[currentLetter] = true;
Обозначение скобок позволяет нам создать свойство для объекта, и текущая буква будет каждой отдельной буквой.
Мы уменьшаем, если аккумулятор равен заданной букве, если мы больше не видим букву в строке, что это уникальная или отличная буква, и мы сохраняем букву в объекте как таковую. В конце концов, мы возвращаем письмо как отдельное письмо.
Мы устанавливаем начальное значение как пустой объект. Поскольку initialValue
не указан, то accumulator
будет равно первому значению в массиве, а currentValue
будет равно второму.
В объекте у нас есть ключ и значение, ключ - это отдельная буква, в то время как значение может быть истинным, поэтому Object.keys()
выстреливает из объекта все ключи, все отдельные буквы.
В конце мы используем встроенный метод sort()
и сортируем ключи в объекте или буквы по алфавиту, в конце мы объединяем буквы с помощью встроенного метода join()
и возвращаем его в строку.
Для меня метод reduce - самый универсальный из когда-либо существовавших.
При желании вы можете решить и найти ката здесь: https://www.codewars.com/kata/two-to-one
А как насчет метода reduceRight ()?
Что ж, этот метод работает наоборот, вместо того, чтобы начинать с первого значения, он начинается с последнего значения или в обратном направлении.
Распространенные ошибки:
- Вы забыли добавить начальное значение по умолчанию (всегда передавайте значение по умолчанию для аккумулятора).
- Вы забыли вернуть аккумулятор.
До следующего раза, удачного кодирования!