【问题标题】:Function using reduce not working; returning false when should be true使用reduce的功能不起作用;当应该为真时返回假
【发布时间】:2017-05-05 00:01:07
【问题描述】:
var atLeast = function (tab,n,k){
    var frequencyK = tab.reduce(function (acc, val, array){
        if (val == k){
            return acc+1;
        }
    });
    return frequencyK >= n;
};
console.log(atLeast([1,2,3,2,2,4,2,2],4,2));

如果参数k 在数组tab 中重复至少n 次,此函数将返回true。为此,我使用了 reduce,每次当前值等于 k 时,累加器就增加 1。然后我将使用reduce函数计算的k的频率与n进行了比较。

问题是频率K 最终是NaN。我不知道为什么会这样。

【问题讨论】:

  • 因为你在 else 子句的 reduce 中没有返回
  • 如果val != k 怎么办?那么回调返回什么?那么acc 会是什么?

标签: javascript arrays reduce


【解决方案1】:

Reduce 有两个参数,归约函数和初始值,您删除了初始值,因此它从第一个元素开始,这是错误的数字。

此外,当您不返回任何内容时,下一个 acc 会得到 undefined 的值,这在数学运算中根本不会发生(这会得到 NaN)。

要更正此问题,请将0 作为初始值添加到.reduce(),并在所有情况下都返回,如下所示:

var atLeast = function (tab,n,k){
    var frequencyK = tab.reduce(function (acc, val, array){
        if (val == k){
            return acc+1;
        }
        return acc;
    }, 0);
    return frequencyK >= n;
};
console.log(atLeast([1,2,3,2,2,4,2,2],4,2));

但是,我认为以下是一种更简单的方法:

const atLeast = (tab, n, k) => tab.filter(item => item === k).length >= n;

【讨论】:

    【解决方案2】:

    reduce 函数中的所有情况都需要返回。

    var atLeast = function (tab,n,k){
        var frequencyK = tab.reduce(function (acc, val, array){
            return val == k ? acc+1 : acc;  //return the val for both cases
        }, 0);  //<-- set zero here
        return frequencyK >= n;
    };
    console.log(atLeast([1,2,3,2,2,4,2,2],4,2));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-23
      • 2020-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 2021-08-09
      相关资源
      最近更新 更多