为什么reduce()的第一个参数返回undefined?

时间:2017-04-02 17:11:16

标签: javascript arrays function ecmascript-6

我正在尝试编写一个以数组作为输入的函数。如果整数是正数,则计算它。如果整数是负数,则将其相加。

我认为js中的reduce()帮助器是最好的解决方法,但是当它运行时我继续为我的第一个参数返回undefined。

这是我的代码:

function countPositivesSumNegatives(input) {
    let countPositive = 0;
    let sumNegative = 0

    if (input === null || input === []){
      return [];
    } else {
      return input.reduce(function(prev,num){
      if (num > 0) { 
      countPositive++; 
      }else{ 
      sumNegative = prev + num};
      }, 0);
    }
    return [countPositive, sumNegative];
}

它抛出了一个TypeError,上面写着:

TypeError:无法读取未定义的属性“0”

当我将'prev'记录到reduce函数内的控制台时,它会为除第一个输入之外的所有输入记录undefined。正如预期的那样,第一个是0.但是对于每个后续输入,它都会记录未定义。为什么会这样?

提前致谢。

2 个答案:

答案 0 :(得分:4)

传递给.reduce()的回调需要返回累积值(将作为prev传递给循环的下一次迭代的值。由于你什么也没有返回,你得到{{ 1}}用于循环的下一次迭代。

这使您尝试执行的操作变得复杂,因为您试图在循环中跟踪两个值。因此,您要么必须完全避免使用undefined,要么必须使其成为一个包含您的值的数据结构。您的使用不是prev的教科书示例。使用.reduce().forEach()进行迭代时,您的代码可能更简单。

for/of

答案 1 :(得分:0)

很抱歉,这不是一个很好的实现这个功能。但我们可以按照以下方式更正您的功能;

var data = [1,2,3,4,5,-4,7,-3],
    cpsn = a => a.reduce((p,c) => c > 0 ? (p[0]++,p) : (p[1]+=c,p) ,[0,0]);
console.log(cpsn(data))

然而,虽然代码工作正常,但它仍然涉及许多问题。当进入像numprocs=8这样的仿函数时,你应该能够保持其自身的内涵,而不应该引用外部范围的变量。因此,可以简单地将此代码改写如下;

numprocs=1