应添加1000以下的所有自然数,即3或5的倍数。
var sum = _.reduce( _.range(1, 1000), function(x, n) {
if (n % 3 == 0 || n % 5 == 0) { return x+=n; }
}, 0);
我希望输出为233168
,但我得到NaN
。
由于某些原因,sum
不接受0
的初始值。但是,如果我在前面加上var sum = 0;
,那么它会起作用并返回233168
的正确输出
为什么它不接受初始值?
答案 0 :(得分:4)
问题是当条件失败时reduce函数返回undefined
。因此x
在后续调用中求值为undefined(最后一个返回值)..而undefined +一个数字是..好吧,NaN。
此外,reduce
使用不当;它应该有自己的状态。将其与:
var sum = _.reduce( _.range(1, 1000), function(x, n) {
// Add n to the tally if it is a valid multiple..
// (the returned value is used as the *next* value of x)
if (n % 3 == 0 || n % 5 == 0) { return x + n; }
// ..or simply return the current tally.
else { return x; }
}, 0);
请注意,sum
变量是不是在reduce函数中分配的(无论如何它都会被外部赋值覆盖)。这使reduce
保持纯粹的操作,而不是偶尔滥用可变备忘录,更真实的functional roots。