下划线.reduce()返回NaN?

时间:2015-09-12 19:29:59

标签: javascript underscore.js

应添加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的正确输出

为什么它不接受初始值?

1 个答案:

答案 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