我正在寻找一种优雅的方法来确定JavaScript数组中出现率最高的元素(mode)。
例如,在以下数组中:
['pear', 'apple', 'orange', 'apple']
'apple'
元素是最常见的一个。
我正在寻找一种优雅的方法来确定JavaScript数组中出现率最高的元素(mode)。
例如,在以下数组中:
['pear', 'apple', 'orange', 'apple']
'apple'
元素是最常见的一个。
var cats = ['Tom','Fluffy','Tom','Bella','Chloe','Tom','Chloe'];
var counts = {};
var compare = 0;
var mostFrequent;
(function(array){
for(var i = 0, len = array.length; i < len; i++){
var word = array[i];
if(counts[word] === undefined){
counts[word] = 1;
}else{
counts[word] = counts[word] + 1;
}
if(counts[word] > compare){
compare = counts[word];
mostFrequent = cats[i];
}
}
return mostFrequent;
})(cats);
可以尝试:
var arr = [10,3,4,5,3,4,3,8,3,6,3,5,1];
var temp = {};
for(let i=0;i<arr.length;i++){
if(temp[arr[i]]==undefined){
temp[arr[i]]=1;
}else{
temp[arr[i]]+=1;
}
}
var max=0, maxEle;
for(const i in temp){
if(temp[i]>max){
max = temp[i];
maxEle=i;
}
}
console.log(`most occurred element is ${maxEle} and number of times is ${max}`);`
function mode(){
var input = $("input").val().split(",");
var mode = [];
var m = [];
var p = [];
for(var x = 0;x< input.length;x++){
if(m.indexOf(input[x])==-1){
m[m.length]=input[x];
}}
for(var x = 0; x< m.length;x++){
p[x]=0;
for(var y = 0; y<input.length;y++){
if(input[y]==m[x]){
p[x]++;
}}}
for(var x = 0;x< p.length;x++){
if(p[x] ==(Math.max.apply(null, p))){
mode.push(m[x]);
}}
$("#output").text(mode);}
我看到很多答案都通过数组进行了很多递归,而我想避免这种情况。除此之外,我希望使用Typescript检查结果并推断正确的类型。
所以这是我的版本:
function findhighestOccurence<Type extends string | number>(myArray: Type[]) {
const countOccorrencies = myArray.reduce<{ [key in Type]: number }>(
(acc, curr) => ({ ...acc, [curr]: acc[curr] ? acc[curr] + 1 : 1 }),
{} as { [K in Type]: number }
)
return (Object.entries(countOccorrencies) as [Type, number][]).reduce<{
values: Type[] // there might be multiple "highest occurences" values
occurrences: number // how many times it has/they have occurred
}>(
(acc, [value, occurrences]) => {
// new highest occurrence
if (occurrences > acc.occurrences)
return {
...acc,
occurrences: occurrences,
values: [value],
}
// new value with same highest amount of occurrences
else if (occurrences === acc.occurrences)
return { ...acc, values: [...acc.values, value] }
return acc
},
{ values: [], occurrences: 0 }
)
}
简明版:
function findhighestOccurenceShort<T extends string | number>(myArray: T[]) {
return (
Object.entries(
myArray.reduce<{ [key in T]: number }>(
(acc, cur) => ({ ...acc, [cur]: acc[cur] ? acc[cur] + 1 : 1 }),
{} as { [K in T]: number }
)
) as [T, number][]
).reduce<{ val: T[]; occ: number }>(
(acc, [val, occ]) =>
occ > acc.occ
? { occ, val: [val] }
: occ === acc.occ
? { occ, val: [...acc.val, val] }
: acc,
{ val: [], occ: 0 }
)
}