Как работает reduce и return в этой функции?
Есть массив arr = [1,2,3,4,5] и нужно написать функцию , которая возвращает массив его частичных сумм. Иначе говоря, вызов этой ф-ии должен возвращать новый массив из такого же числа элементов, в котором на каждой позиции должна быть сумма элементов arr до этой позиции включительно.
То еcть:
arr = [ 1, 2, 3, 4, 5 ]
getSums( arr ) = [ 1, 1+2, 1+2+3, 1+2+3+4, 1+2+3+4+5 ] = [ 1, 3, 6, 10, 15 ]
let arr = [1, 2, 3, 4, 5];
function getSums(el) {
let result = [];
el.reduce((sum, val, ind) => {
let sumEl = sum + val;
result[ind] = sumEl;
return sumEl;
}, 0);
return result;
}
console.log(getSums(arr));
Но у меня есть вопросы:
Зачем в качестве в качестве аргумента в getSums передавать el? Ведь получается, что под el подразумевается каждый элемент массива, но при этом внутри ф-ии применяется метод reduce, который и так предназначен для последовательной обработки каждого элемента массива... обычно же пишется arr.reduce, а тут в переводе на человеческий язык получается, что нужно выполнить какое-то действие над каждым элементов в каждом элементе.
Я не совсем понимаю строчку result[ind] = sumEl. Как я понял, этой строчка вносит результат суммы предыдущего и следующего элемента массива arr в массив result, верно? И это тоже самое, что push-ить сумму в новый массив? Просто опять же в переводе на человеческий язык это звучит как - КАЖДЫЙ индекс элемента массива result равен результату суммы элементов массива arr.
Почему код не работает без строчки return sumEl? Зачем его возвращать? Чтобы в reduce хранился результат суммы? Тот же вопрос про return result.
Ответы (1 шт):
Вот еще один вариант уменьшения фукнции, без использования дополнительных переменных(и синтаксис чуть по проще)
let arrToCalc = [1, 2, 3, 4, 5];
/**
* @param {number[]} arr
* @return {number[]}
*/
function getSums(arr) {
return arr.reduce((sum, val, ind) => {
ind ? sum[ind] = sum[ind - 1] + val : sum[0] += val;
return sum;
}, [0]);
}
console.log(getSums(arrToCalc));