阵列中出现次数最多或首次选择

时间:2016-11-03 20:15:21

标签: javascript jquery

我试图获得最高出现的数组值,如果出现相同的值,我应该得到相同出现次数的第一个选定值。

示例:

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

欢迎任何帮助。

4 个答案:

答案 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

如果选择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);