首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么reduce()返回的第一个参数没有定义?

为什么reduce()返回的第一个参数没有定义?
EN

Stack Overflow用户
提问于 2017-04-02 09:11:15
回答 2查看 917关注 0票数 0

我正在尝试编写一个函数,它接受数组作为输入。如果整数是正数,它会计数它。如果整数是负的,它就把它和起来。

我认为js中的reduce()助手将是最好的方法,但在第一个参数运行时,我总是返回未定义的参数。

这是我的密码:

代码语言:javascript
运行
AI代码解释
复制
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‘记录到减缩函数内部的控制台时,除了第一个输入之外,它会记录所有未定义的输入。第一个,如预期的,是0。但对于每一个后续输入,它都会记录未定义的日志。为什么会发生这种情况?

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-02 09:14:14

传递给.reduce()的回调需要返回累积值(将作为prev传递给循环的下一次迭代的值)。由于您不返回任何内容,所以您将获得循环的下一次迭代的undefined

这使您想要做的事情更加复杂,因为您试图跟踪循环中的两个值。因此,您要么必须完全避免使用prev,要么就必须使它成为一个包含两个值的数据结构。您的使用不是.reduce()的教科书示例。通过使用.forEach()for/of进行迭代,您的代码可能更简单。

代码语言:javascript
运行
AI代码解释
复制
function countPositivesSumNegatives(input) {
    let countPositive = 0;
    let sumNegative = 0

    if (!input || input.length === 0){
      return [];
    } else {
      input.forEach(function(num){
        if (num > 0) {
          ++countPositive;
        } else { 
          sumNegative += num;
      });
    }
    return [countPositive, sumNegative];
}
票数 4
EN

Stack Overflow用户

发布于 2017-04-02 09:40:28

很抱歉,但是这不是这个功能的一个很好的实现。但我们可以纠正您的功能如下;

代码语言:javascript
运行
AI代码解释
复制
function countPositivesSumNegatives(input) {
    let countPositive = 0;
    let sumNegative = 0;

    if (input === null || input === []){
      return [];
    } else {
        sumNegative = input.reduce(function(prev,num){
                                     if (num > 0) { 
                                       countPositive++;
                                     } else { 
                                         prev += num;
                                       }
                                     return prev; // <---- THE MISSING PART
                                   }, 0);
      }
    return [countPositive, sumNegative];
}
var data = [1,2,3,4,5,-4,7,-3];
console.log(countPositivesSumNegatives(data));

然而,尽管代码工作得很好,但它仍然涉及许多问题。当进入像.reduce()这样的函子时,你应该能够将所有的东西都保存在它的内部,而不应该在外部范围内引用变量。因此,您可以简单地将此代码重新表述如下;

代码语言:javascript
运行
AI代码解释
复制
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))

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43171120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档