Reduce это просто!

Reduce - отличный метод перебора в javascript, который позволяет делать "свертки" массива. За словом свертка здесь стоит операция вычисления каких-либо значений на основе массивов. Пример - вычисление суммы элементов массива:


let a = [1, 2, 3, 4];

let sum = 0;
for (let i = 0; i < a.length; i++) {
    sum = sum + a[i];
}
console.log(sum);

А с reduce это выглядит так:


let b = a.reduce((prev, item, index) => { 
    return prev + item;
}, 0);   // после функции можно задать начальное значение prev - 0

Здесь:

  • prev - вычисляемое значение. В нем в начальный момент в нем лежит нулевой элемент массива, но можно задать свое значение - в данном случае это 0.
  • item - текущий элемент массива при переборе.
  • index, array - не обязательные параметры

Функция делает следующее - вычисляет и возвращает значение на основе переменных, после чего все, что после return записывается в prev. И выполняется следующий круг перебора.

Как понять где применять reduce? Везде где циклом перебирают массив и есть переменные за циклом - которые изменяются внутри цикла, скорее всего можно более просто написать на reduce.

Еще несколько применений reduce

Нахождение максимального элемента массива. Классическое вычисление:


let max = a[0];
for (let i = 0; i < a.length; i++) {
    if (a[i] > max) {
        max = a[i];
    }
}

console.log(max);

И с применением reduce:


let c = a.reduce((prev, item) => {
    if (prev < item) {
        return item;
    }
    else {
        return prev;
    }
}, a[0]);
console.log(c);   

Еще пример: найти индекс максимально элемента в массиве. И тут нас поджидает открытие - ведь можно в качестве prev, и его начального значения указывать массив!

Классическое решение:


max = a[0];
let index = 0;
for (let i = 0; i < a.length; i++) {
    if (a[i] > max) {
        max = a[i];
        index = i;
    }
} 
console.log(index);   

и reduce:


let d = a.reduce((prev, item, index) => {
    if (item > prev[1]) {
        return [index, item];
    }
    else {
        return prev;
    }
}, [0, a[0]]);

console.log(d);    

И последняя задача, которую когда-то спросили на собеседовании. Необходимо превратить массив в одномерный:


const data = [[1, 2, 3], [3, 4, 5], [5, 6, 7]];
const flat = data.reduce((prev, item) => {
return prev.concat(item);
}, []);
console.log(flat);

Скачать код урока.

Скачать код урока

Еще статьи

Следи за новостями курсов на нашем канале

Открыть

Правила оформления домашних заданий

Открыть

Форум по задачам

Forum