Метод 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 ()?

Что ж, этот метод работает наоборот, вместо того, чтобы начинать с первого значения, он начинается с последнего значения или в обратном направлении.

Распространенные ошибки:

  • Вы забыли добавить начальное значение по умолчанию (всегда передавайте значение по умолчанию для аккумулятора).
  • Вы забыли вернуть аккумулятор.

До следующего раза, удачного кодирования!