下划线 .reduce() returns NaN?
Underscore .reduce() returns NaN?
应将 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;
那么它就可以工作,并且 returns 是 233168
的正确输出
为什么不接受初始化值?
问题是当条件失败时减少函数 returns undefined
.. 因此 x
在随后的计算中未定义(最后一个 return 值)调用 .. 和未定义 + 数字是 .. 好吧,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
成为一个纯粹的操作,尽管偶尔会滥用可变备忘录,但更符合其 functional roots。
应将 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;
那么它就可以工作,并且 returns 是 233168
为什么不接受初始化值?
问题是当条件失败时减少函数 returns undefined
.. 因此 x
在随后的计算中未定义(最后一个 return 值)调用 .. 和未定义 + 数字是 .. 好吧,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
成为一个纯粹的操作,尽管偶尔会滥用可变备忘录,但更符合其 functional roots。