Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.12.2018, 13:25
hoz hoz вне форума
Интересующийся
Отправить личное сообщение для hoz Посмотреть профиль Найти все сообщения от hoz
 
Регистрация: 26.11.2018
Сообщений: 19

Вопрос по методу 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-функции до этого момента ещё не было. Но как я вижу, в результирующем массиве всё не так.. там первым значением попадает первый элемент исходного массива.
С чего бы то вдруг?
Ответить с цитированием
  #2 (permalink)  
Старый 12.12.2018, 13:29
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

https://developer.mozilla.org/ru/doc...s/Array/Reduce
Ответить с цитированием
  #3 (permalink)  
Старый 12.12.2018, 13:30
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от hoz
С чего бы то вдруг?
если в reduce не передан второй параметр (стартовое значение аккумулятора) то берется нулевой элемент массива, а итерации идут начиная с первого
Ответить с цитированием
  #4 (permalink)  
Старый 12.12.2018, 13:33
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,795

Сообщение от 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
Ответить с цитированием
  #5 (permalink)  
Старый 12.12.2018, 14:25
hoz hoz вне форума
Интересующийся
Отправить личное сообщение для hoz Посмотреть профиль Найти все сообщения от hoz
 
Регистрация: 26.11.2018
Сообщений: 19

Сообщение от laimas Посмотреть сообщение
https://developer.mozilla.org/ru/doc...s/Array/Reduce
А смысл дублировать? Я же изначально написал, что при чтении именно этой ссылки возник вопрос..
Ответить с цитированием
  #6 (permalink)  
Старый 12.12.2018, 14:28
hoz hoz вне форума
Интересующийся
Отправить личное сообщение для hoz Посмотреть профиль Найти все сообщения от hoz
 
Регистрация: 26.11.2018
Сообщений: 19

Nexus,
Благодарю за развёрнутый ответ. Не дочитал.. Вопрос снят.
Ответить с цитированием
  #7 (permalink)  
Старый 12.12.2018, 14:40
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от hoz
А смысл дублировать?
Если не понятно на инглиш, прочтите на русском, там написан ответ на ваш вопрос понятным языком.
Ответить с цитированием
  #8 (permalink)  
Старый 12.12.2018, 15:12
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 641

reduce мощная ф-ция, все зависит от кол-ва переданных параметров
Ответить с цитированием
  #9 (permalink)  
Старый 12.12.2018, 19:45
hoz hoz вне форума
Интересующийся
Отправить личное сообщение для hoz Посмотреть профиль Найти все сообщения от hoz
 
Регистрация: 26.11.2018
Сообщений: 19

Сообщение от laimas Посмотреть сообщение
Если не понятно на инглиш, прочтите на русском, там написан ответ на ваш вопрос понятным языком.
Понятно. Не дочитал. Дикий синтаксис и философия JS. Как-то, до сих пор, дико..
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по методу send() DmitryT AJAX и COMET 11 23.06.2011 09:59
Я как ответить на вопрос - есть ли жизнь на других планетах? TicTac Оффтопик 5 28.04.2011 04:29
Вопрос авторизации. 0931454574 Серверные языки и технологии 8 12.04.2011 11:09
Вопрос на миллион. Ajax и идентификация по адресной строке. 0931454574 AJAX и COMET 5 31.03.2011 11:54
Вопрос по замыканиям Goodfella Общие вопросы Javascript 20 09.03.2011 01:21