我知道这个问题已被问过多次,但我没有找到所需的解决方案。
我的任务是找到数组中出现次数最多的数字。首先,我必须转换为数字,因为我们的输入是以字符串形式给出的。之后,我使用 lambda 表达式对数组进行排序。 (我不明白它是如何工作的,我只知道它是这样的)。现在我想过滤数组 [ 1, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4, 4, 9, 13 ] 所以只有 [4, 4, 4, 4, 4]离开了。我想使用 .filter
或 .reduce
。
function z(input)
{
let numbers = input.map(n => +n)
.sort((a, b) => a - b)
.filter();
console.log(numbers);
}
z(['13', '4', '1', '1', '4', '2', '3', '4', '4', '1', '2', '4', '9', '3']);
如果有人可以解释一下:
function mode(arr){
return arr.sort((a,b) =>
arr.filter(v => v===a).length
- arr.filter(v => v===b).length
).pop();
}
mode(['pear', 'apple', 'orange', 'apple']); // apple
arr.sort 上的回调需要两个参数 a 和 b,但是之后我无法理解发生了什么。
事实上,任何有关如何使用 lambda 的指南都将受到赞赏。
最佳答案
您可以使用Map
用于收集具有相同值的元素,并通过检查数组的长度并根据先前存储的结果检查实际长度来采用单循环方法。
这种方法考虑了如果多个值具有相同长度的可能性,则所有数组都以最大长度返回。
const z = a => {
var m = new Map;
return a.reduce((r, v, i) => { // create map
var array = m.get(v) || m.set(v, []).get(v); // get/create array
array.push(v); // push value
if (!i || r[0].length < array.length) { // take first or check
return [array]; // return array
}
if (r[0] !== array && r[0].length === array.length) { // prevent push same a
r.push(array); // push with same len
}
return r;
}, undefined);
};
console.log(z(['13', '4', '1', '1', '4', '2', '3', '4', '4', '1', '2', '4', '9', '3']));
console.log(z(['pear', 'apple', 'orange', 'apple']));
.as-console-wrapper { max-height: 100% !important; top: 0; }
关于javascript - 使用 JavaScript 使用 lambda 和正则表达式查找数组中最常见的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48140034/