@Lolipop999

Как работает 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));


Но у меня есть вопросы:

1) Зачем в качестве в качестве аргумента в getSums передавать el? Ведь получается, что под el подразумевается каждый элемент массива, но при этом внутри ф-ии применяется метод reduce, который и так предназначен для последовательной обработки каждого элемента массива... обычно же пишется arr.reduce, а тут в переводе на человеческий язык получается, что нужно выполнить какое-то действие над каждым элементов в каждом элементе.

2) Я не совсем понимаю строчку result[ind] = sumEl. Как я понял, этой строчка вносит результат суммы предыдущего и следующего элемента массива arr в массив result, верно? И это тоже самое, что push-ить сумму в новый массив? Просто опять же в переводе на человеческий язык это звучит как - КАЖДЫЙ индекс элемента массива result равен результату суммы элементов массива arr.

3) Почему код не работает без строчки return sumEl? Зачем его возвращать? Чтобы в reduce хранился результат суммы? Тот же вопрос про return result.
  • Вопрос задан
  • 93 просмотра
Решения вопроса 1
Kentavr16
@Kentavr16
long cold winter
1) Под el подразумевается в данном случае аргумент, который будет передан функции. Название может быть произвольным - хоть arr,хоть el,хоть любое другое - на что хватит воображения автору.
Ведь получается, что под el подразумевается каждый элемент массива
- неверно. В данном случае функции передается массив arr, значит под el подразумевается массив arr.
2) можете заменить строчку кода на result.push(sumEl), ничего не поменяется.
КАЖДЫЙ индекс элемента массива result равен результату суммы элементов массива arr.
- не совсем верно. Это звучит как "на каждой итерации добавить значение в массив result по индексу, который равен индексу текущей итерации". Усложненный вариант, пуш вполне подходит.
3)Заходим на mdn и читаем -
Метод reduce() применяет функцию reducer к каждому элементу массива (слева-направо), возвращая одно результирующее значение.
То есть на каждой итерации редьюс возвращает результат действий над текущим элементом массива. То есть на второй итерации мы возвращаем 1+2(3), и именно благодаря этому наша функция reduce на следующей итерации в аргумент sum получает 3, прибавляет к нему следующий элемент - 3, и возвращает их сумму - 6. Третья итерация "ловит" 6 ,прибавляет текущий элемент 4 и передает дальше их сумму 10.
return result просто возвращает результат выполнения нашей функции , чтобы можно было использовать этот результат вне функции. В данном случае вернувшийся результат передается в console.log.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы