Методы массивов: 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]