如果我有一个数字数组,我想得到一个出现最频繁的,但有两个可能的答案,我有麻烦排序的一部分。例如,下面应该返回1和7,但我只得到7。任何帮助是感激。
let arr = [1, 1, 2, 3, 4, 5, 6, 7, 7];
function findMode(numbers) {
let counted = numbers.reduce((acc, curr) => {
if (curr in acc) {
acc[curr]++;
} else {
acc[curr] = 1;
}
return acc;
}, {});
let mode = Object.keys(counted).reduce((a, b) => counted[a] > counted[b] ? a : b);
return mode;
}
console.log(findMode(arr));
5条答案
按热度按时间vfhzx4xs1#
你可以将相等的元素分组到子数组中,然后按子数组长度排序,并检索具有相同数组长度的第一个值,如下所示:
7xllpg7q2#
可以使用数组作为累加器。
或者,您可以找到最高频率,然后使用
filter
查找具有该频率的数字。8zzbczxx3#
你可以在第一次循环中跟踪
max
的出现次数,然后使用Array#filter
来获得具有以下值的keys
:oxalkeyp4#
由于整个操作发生在函数作用域内,我们也可以用两个
.forEach()
循环来完成:在第一个中,我们收集计数,然后在第二个中,我们用“获胜者”组装结果数组。通过使用
map
来收集计数,我们避免了使用普通对象时会发生的类型转换为字符串。n6lpvg4x5#
你可以通过在一个循环中直接获取count,max frequency和values来减少数组。