繁体   English   中英

阵列中出现次数最高或首次选定的事件

[英]Highest occurrence in an array or first selected

我正在尝试获得数组值的最高出现,并且如果存在相等的出现,则应该获取相等出现的第一个选定值。

例:

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();
}

欢迎对此提供任何帮助。

您可以使用如下形式:

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

如果选择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)替换为Math.max(...map)

尝试这个:

 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'])); 

它与获取数组中出现次数最多的元素中的方法基本相同,只是最后一行是有效的:与其返回最后一个maxElement ,不返回最后一个maxElement ,而是返回occurrences图中与maxCount count相同的第一个元素。

除了给定的解决方案之外,该建议还具有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'])); 

编辑:新的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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM