我有一个数组,希望得到最多出现的元素,
第一种情况
let arr1 = ['foo', 'foo', 'foo', 'bar', 'bar', 'bar', 'baz', 'baz']
let newArr = someFunc(arr1)
所以在这种情况下,我希望新数组具有值
console.log(newArr) // ['foo', 'bar']
因为值'foo'和'bar'是数组中最常出现的元素
第二种情况
let arr2 = ['foo', 'foo', 'foo', 'bar', 'baz']
let newArr = someFunc(arr2)
所以在这种情况下,我希望新数组具有值
console.log(newArr) // ['foo']
因为值'foo'是数组中最常出现的元素
这是我尝试过的方法,即使有多个元素出现相同的时间,也只会让我获得其中一个元素
newArr= arr.sort((a,b) =>
arr.filter(v => v===a).length
- arr.filter(v => v===b).length
).pop()
答案 0 :(得分:3)
您可以使用reduce
对项目进行计数,并找到最大出现次数。然后,您可以过滤所有具有该计数的键:
let arr = ['foo', 'foo', 'foo', 'bar', 'bar', 'bar', 'baz', 'baz'];
let counts = arr.reduce((a, c) => {
a[c] = (a[c] || 0) + 1;
return a;
}, {});
let maxCount = Math.max(...Object.values(counts));
let mostFrequent = Object.keys(counts).filter(k => counts[k] === maxCount);
console.log(mostFrequent);
答案 1 :(得分:1)
您可以为每个值计算max
,并仅通过将它们与Array.reduce
分组来返回匹配的值:
const mostFrequent = data => data.reduce((r,c,i,a) => {
r[c] = (r[c] || 0) + 1
r.max = r[c] > r.max ? r[c] : r.max
if(i == a.length-1) {
r = Object.entries(r).filter(([k,v]) => v == r.max && k != 'max')
return r.map(x => x[0])
}
return r
}, {max: 0})
console.log(mostFrequent(['foo', 'foo', 'foo', 'bar', 'bar', 'bar', 'baz', 'baz']))
console.log(mostFrequent(['foo', 'foo', 'foo', 'bar', 'baz']))
答案 2 :(得分:0)
您还可以使用for of
循环和ìn
例如
const arrayFrecuent = [3, 1, 2, 1, 3, 2, 5, 4, 2, 10];
const mostFrecuent = givenArray => {
let counts = {};
let maxValue = -1;
let maxItem = null;
for (const num of givenArray) {
if (!(num in counts)) {
counts[num] = 1;
} else {
counts[num] = counts[num] + 1;
}
if (counts[num] > maxValue) {
maxValue = counts[num];
maxItem = num;
}
}
return maxItem;
};
const mostFrecuentNumber = mostFrecuent(arrayFrecuent);
console.log("mostFrecuentNumber", mostFrecuentNumber);