功能使用减少不起作用;如果应该是真的,则返回false

时间:2016-12-19 21:06:02

标签: javascript arrays reduce

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。我无法弄清楚为什么会这样。

2 个答案:

答案 0 :(得分:3)

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;

答案 1 :(得分: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));