我试图获得最高出现的数组值,如果出现相同的值,我应该得到相同出现次数的第一个选定值。
示例:
var array = ['25', '50', 'a', 'a', 'b', 'c']
在这种情况下,我应该a
var array = ['75', '100', 'a', 'b', 'b', 'a']
在这种情况下,我也应该得到a
我已经完成了相当多的搜索,发现了一些有用的帖子,例如:
不知怎的,我似乎无法修改这些例子以适应我的情况。
现在我正在使用下面的代码,但是它返回的是最后一次选择的相等,而不是第一次。 (信用https://stackoverflow.com/users/1238344/emissary)
function mostFrequent(array){
return array.sort(function(a,b){
return array.filter(function(v){ return v===a }).length
- array.filter(function(v){ return v===b }).length
}).pop();
}
欢迎任何帮助。
答案 0 :(得分:2)
您可以使用以下内容:
function mostFrequent(array) {
var map = array.map(function(a) {
return array.filter(function(b) {
return a === b;
}).length;
});
return array[map.indexOf(Math.max.apply(null, map))];
}
首先,它会创建所有值的出现地图。接下来只需查看Math.max
哪一个最高。检查indexOf
以查找具有最高出现次数的第一个值,并返回原始数组中该索引的值。
如果选择ES2015,您可以使用此选项。它的代码更少。
function mostFrequent(array) {
let map = array.map((a) => array.filter((b) => a === b).length);
return array[map.indexOf(Math.max.apply(null, map))];
}
如果你在一个甚至允许传播操作员的地方(NodeJS v5及更高版本,Chrome 54),你可以替换Math.max.apply(null, map)
的{{1}}!
答案 1 :(得分:1)
试试这个:
const mostFrequent = arr => {
let maxCount = 0;
const occurrences = new Map();
arr.forEach(x => {
const count = occurrences.has(x) ? occurrences.get(x) + 1 : 1;
occurrences.set(x, count);
maxCount = count > maxCount ? count : maxCount;
});
return Array.from(occurrences).find(([element, count]) => count === maxCount)[0];
};
console.log(mostFrequent(['25', '50', 'a', 'a', 'b', 'c']));
console.log(mostFrequent(['75', '100', 'a', 'b', 'b', 'a']));
它基本上与Get the element with the highest occurrence in an array中的解决方案相同,只有最后一行是重要的:它不返回最后一个maxElement
,而是返回occurrences
地图中具有与count
相同maxCount
。
答案 2 :(得分:0)
除了给定的解决方案之外,该提议还具有O(n)的复杂性 - 仅一个循环。
基本上有两个对象,一个哈希表和一个结果集,它们通过迭代维护。
function getValue(array) {
var count = 0,
index = -1;
array.forEach(function (a, i) {
this[a] = this[a] || { count: 0, index: i };
this[a].count++;
if (this[a].count > count) {
count = this[a].count;
index = this[a].index;
return;
}
if (this[a].count === count && this[a].index < index) {
index = this[a].index;
}
}, Object.create(null));
return array[index];
}
console.log(getValue(['25', '50', 'a', 'a', 'b', 'c']));
console.log(getValue(['25', '50', 'a', 'b', 'b', 'a', 'c']));
答案 3 :(得分:-1)
编辑:新jsfiddle。
像这样:https://jsfiddle.net/Ldohv125/1/
var array = ['75', '100', 'b', 'b', 'a', 'a'];
var mf = 1;
var m = 0;
var item;
for (var i=0; i<array.length; i++){
for (var j=i; j<array.length; j++) {
if (array[i] == array[j])
m++;
if (mf<m){
mf=m;
item = array[i];
}
}
m=0;
}
alert(item);