Это относится к функции reduce, которую я воссоздал здесь, но вопрос другой: Воссоздание функции reduce в JavaScript.

Я читаю Eloquent JavaScript и заметил, что они воссоздали функцию reduce немного другим способом с меньшим количеством кода:

function reduce(array, combine, start) {
  var current = start;
  for (var i = 0; i < array.length; i++)
    current = combine(current, array[i]);
  return current;
}

console.log(reduce([1, 2, 3, 4], function(a, b) {
  return a + b;
}, 0)); // → 10

Я заметил, что это работает только тогда, когда есть начало. Например, если я уберу start(0) и будет просто:

console.log(reduce([1, 2, 3, 4], function(a, b) {
  return a + b;
})); // NaN

Это вернет NaN. Это не имеет смысла, потому что в книге сказано: "Если ваш массив содержит хотя бы один элемент, вы можете не указывать аргумент start. Метод примет первый элемент массива за начальное значение и начнет уменьшение со второго элемента."

Только когда я корректирую его с помощью оператора if, он выдает "10" с началом(0) или без него.

function reduce(array, combine, start) {
  var current = start;

  for (var i = 0; i < array.length; i++)
    if(current !==undefined){
      current = combine(current, array[i]);
    }else{
      current=array[i]; 
    }

 return current;
}

Что я упускаю?

Ответы (1)

Вот как это должно быть, согласно MDN (упрощенная версия здесь):

function reduce(array, combine, start) {
  var current = start;
  var i = 0;
  if (arguments.length < 2) {
    while (array[i] === undefined) {
      i ++;
      if (array.length >= i) {
        throw new Error('Empty array with no initial value');
      }
    }
    current = array[i];
  }

  for (; i < array.length; ++ i) {
    if (array[i] === undefined) continue;
    if (current !== undefined) {
      current = combine(current, array[i]);
    } else {
      current=array[i]; 
    }
  }

  return current;
}

2022 WebDevInsider