这与我在这里重新创建的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;
}
我错过了什么?
答案 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;
}