Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вопрос по методу reduce() (https://javascript.ru/forum/misc/76191-vopros-po-metodu-reduce.html)

hoz 12.12.2018 13:25

Вопрос по методу reduce()
 
Читаю документацию на mdn по методу reduce().
Интересен первый параметр callback-функции, который называется accumulator:
Вот оригинальное описание:
"accumulator
The accumulator accumulates the callback's return values; it is the accumulated value previously returned in the last invocation of the callback, or initialValue, if supplied (see below)."
Очевидно, что accumulator накапливает все итерации вызовов callback-функции т.е. каждый её return.
В учебнике странный пример:
function getSums(arr) {
  var result = [];
  if (!arr.length) return result;

  var totalSum = arr.reduce(function(sum, item) {
    result.push(sum);
    return sum + item;
  });
  result.push(totalSum);

  return result;
}

alert(getSums([1,2,3,4,5])); // 1,3,6,10,15
alert(getSums([-2,-1,0,1])); // -2,-3,-3,-2

Я вижу что, когда метод reduce вызовется первый раз, то в массив result должно попасть пустое значение. Я имею ввиду о строке:
result.push(sum);

Логика такова, что предыдущего вызова callback-функции до этого момента ещё не было. Но как я вижу, в результирующем массиве всё не так.. там первым значением попадает первый элемент исходного массива.
С чего бы то вдруг?

laimas 12.12.2018 13:29

https://developer.mozilla.org/ru/doc...s/Array/Reduce

Alexandroppolus 12.12.2018 13:30

Цитата:

Сообщение от hoz
С чего бы то вдруг?

если в reduce не передан второй параметр (стартовое значение аккумулятора) то берется нулевой элемент массива, а итерации идут начиная с первого

Nexus 12.12.2018 13:33

Цитата:

Сообщение от hoz
Логика такова, что предыдущего вызова callback-функции до этого момента ещё не было. Но как я вижу, в результирующем массиве всё не так

Там же:
Цитата:

The first time the callback is called, accumulator and currentValue can be one of two values. If initialValue is provided in the call to reduce(), then accumulator will be equal to initialValue, and currentValue will be equal to the first value in the array. If no initialValue is provided, then accumulator will be equal to the first value in the array, and currentValue will be equal to the second.
Цитата:

Кроме callback, методу можно передать «начальное значение» – аргумент initialValue. Если он есть, то на первом вызове значение previousValue будет равно initialValue, а если у reduce нет второго аргумента, то оно равно первому элементу массива, а перебор начинается со второго.
© https://learn.javascript.ru/array-it...ce-reduceright

hoz 12.12.2018 14:25

Цитата:

Сообщение от laimas (Сообщение 500363)

А смысл дублировать? Я же изначально написал, что при чтении именно этой ссылки возник вопрос..

hoz 12.12.2018 14:28

Nexus,
Благодарю за развёрнутый ответ. Не дочитал.. Вопрос снят.

laimas 12.12.2018 14:40

Цитата:

Сообщение от hoz
А смысл дублировать?

Если не понятно на инглиш, прочтите на русском, там написан ответ на ваш вопрос понятным языком.

SuperZen 12.12.2018 15:12

reduce мощная ф-ция, все зависит от кол-ва переданных параметров

hoz 12.12.2018 19:45

Цитата:

Сообщение от laimas (Сообщение 500381)
Если не понятно на инглиш, прочтите на русском, там написан ответ на ваш вопрос понятным языком.

Понятно. Не дочитал. Дикий синтаксис и философия JS. Как-то, до сих пор, дико.. :D


Часовой пояс GMT +3, время: 20:11.