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