February 17, 2020

Методы массивов: reduce, spread

Метод reduce

Метод reduce, наверное, самый сложный метод при работе с массивом, поэтому придется напрячь свои извилинки и внимательно вникать в суть происходящего.

Метод работает с элементами слева-направо.

Один из главных аргументов метода, как и у многих других – callback-функция. Данный метод необычен тем, что результат callback-функции сохраняется для следующего элемента. Т.е. при вызове callback на следующем элементе, метод позволяет получить доступ к значению вернувшемуся из этого же callback, но на предыдущем элементе. Грубо говоря, метод выполнил callback-функцию на первом элементе массива и переходя ко второму элементу, мы имеем доступ к значению которое вернул callback на первом элементе. Итак, пока ты не запутался и не упал на пол, нужно добавить в объяснения щепотку кода.

Давай с помощью этого метода посчитаем сумму всех элементов массива:

const numbers = [50, 50, 1];

const results = numbers.reduce(function(previousValue, currentElem){
   return previousValue + currentElem; 
}, 0);

results; // 101

Пожалуй, стоит объяснить, что тут происходит.

Во-первых, разберем все аргументы, которая может принимать callback-функция:

  • Первый аргумент (previousValue) – значение, которое вернула callback-функция для предыдущего элемента;
  • Второй аргумент (currentElem) – текущий элемент;
  • Третий аргумент – индекс текущего элемента в массиве;
  • Четвертый аргумент – сам массив, по которому бежит метод reduce.

Мы в своей callback-функции использовали только первые два аргумента, т.к. для нашей задачи этого достаточно.

Наша callback-функция возвращает следующее значение:

return previousValue + currentElem;

Т.е. каждый новый элемент суммируется с предыдущим. По итогу мы и получим сумму всех элементов.

Второй аргумент метода reduce – начальное значение (initialValue) для всего метода. В нашем случае мы указали значение 0. Если бы мы указали, например, значение 100, то результатом работы метода стало бы значение не 101, а 201. Т.е., если тебе нужно к какому-то числу прибавить сумму всего массива, то это самое число нужно указать в качестве начального значения.

У данного метода есть брат-акробат, который выполняет все то же самое и работает точно так же, но начинает пробегать по элементам справа-налево и называется этот метод – reduceRight.

Оператор spread

Оператор spread не является методом массива, но достаточно полезен при работе с массивами, поэтому пройти мимо него – преступление, которое карается смертной казнью – отрубанием головы через повешение.

Оператор выглядит достаточно непривычно относительно других рани увиденных тобой операторов. Выглядит он так: ...

Да-да, этот оператор представляет из себя три точки =)

С его помощью, можно объединять массивы:

const numbers = [3, 4, 5];
const arr = [1, 2, ...numbers];

arr; //[1, 2, 3, 4, 5]

Надеюсь ты заметил, что внутри определения нового массива, одним из элементов я указал другой массив с оператором spread перед ним. Тем самым мы объединяем 2 массива в один. Но можно не 2, сколько угодно:

const numbers = [1, 2, 3];
const otherNumbers = [4, 5, 6];

const resultArr = [...numbers, ...otherNumbers];

resultArr; // [1, 2, 3, 4, 5, 6]

Так же с помощью этого оператора можно скопировать массив. Но запомни, что таким методом можно копировать только массивы с примитивными значениями (числа, строки, булевы значения ), но никак не массива элементами которых являются сложные объекты! Пример копирования:

const numbers = [1, 2, 3, 4, 5];
const copyNumbers = [...numbers];

copyNumbers; // [1, 2, 3, 4, 5]