重新创建JavaScript Reduce功能第2部分

时间:2016-01-01 09:26:09

标签: javascript function underscore.js reduce

这与我在这里重新创建的reduce函数有关,但是另一个问题是:Recreating JavaScript's reduce function

我正在阅读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

我注意到这只有在开始时才有效。例如,如果我拿走了开始(0)而它只是:

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

它将返回NaN。这对我来说没有意义,因为这本书说: &#34;如果您的数组包含至少一个元素,则可以不使用start参数。该方法将数组的第一个元素作为其起始值,并在第二个元素处开始减少。&#34;

只有当我使用if语句进行调整时才会产生&#34; 10&#34;有或没有开始(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 个答案:

答案 0 :(得分:2)

根据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;
}