Получить элемент с наибольшим вхождением в массиве - PullRequest
66 голосов
/ 28 июня 2009

Я ищу элегантный способ определить, какой элемент имеет наибольшее вхождение ( mode ) в массиве JavaScript.

Например, в

['pear', 'apple', 'orange', 'apple']

элемент 'apple' является наиболее частым.

Ответы [ 27 ]

0 голосов
/ 16 августа 2017
function mode(array){
    var set = Array.from(new Set(array));
    var counts = set.map(a=>array.filter(b=>b==a).length);
    var indices = counts.map((a,b)=>Math.max(...counts)===a?b:0).filter(b=>b!==0);
    var mode = indices.map(a=>set[a]);
    return mode;
}
0 голосов
/ 20 мая 2017
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);}
0 голосов
/ 18 февраля 2015
var array = [1, 3, 6, 6, 6, 6, 7, 7, 12, 12, 17],
    c = {}, // counters
    s = []; // sortable array

for (var i=0; i<array.length; i++) {
    c[array[i]] = c[array[i]] || 0; // initialize
    c[array[i]]++;
} // count occurrences

for (var key in c) {
    s.push([key, c[key]])
} // build sortable array from counters

s.sort(function(a, b) {return b[1]-a[1];});

var firstMode = s[0][0];
console.log(firstMode);
0 голосов
/ 08 февраля 2017
const mode = (str) => {
  return str
    .split(' ')
    .reduce((data, key) => {
      let counter = data.map[key] + 1 || 1
      data.map[key] = counter

      if (counter > data.counter) {
        data.counter = counter
        data.mode = key
      }

      return data
    }, {
      counter: 0,
      mode: null,
      map: {}
    })
    .mode
}

console.log(mode('the t-rex is the greatest of them all'))
0 голосов
/ 19 мая 2016

Вы можете решить это за O (n) сложность

var arr = [1,3,54,56,6,6,1,6];
var obj = {};

/* first convert the array in to object with unique elements and number of times each element is repeated */
for(var i = 0; i < arr.length; i++)
{
   var x = arr[i];
   if(!obj[x])
     obj[x] = 1;
   else 
     obj[x]++;
}

console.log(obj);//just for reference

/* now traverse the object to get the element */
var index = 0;
var max = 0;

for(var obIndex in obj)
{
  if(obj[obIndex] > max)
  {
    max = obj[obIndex];
    index = obIndex;
  }
}
console.log(index+" got maximum time repeated, with "+ max +" times" );

Просто скопируйте и вставьте в консоль Chrome, чтобы запустить приведенный выше код.

0 голосов
/ 13 августа 2010

Я думаю, у вас есть два подхода. Оба из которых имеют преимущества.

Сортируйте затем Count или Loop и используйте хэш-таблицу для подсчета.

Хеш-таблица хороша тем, что, как только вы закончите обработку, у вас также будут все отдельные элементы. Если бы у вас было миллионы элементов, хеш-таблица могла бы в конечном итоге использовать много памяти при низкой частоте дублирования. Подход «сортировка, затем подсчет» будет иметь гораздо более контролируемый след памяти.

0 голосов
/ 09 августа 2016

Эта функция является универсальной для каждого типа информации. Он считает наличие элементов, а затем возвращает массив с максимальным количеством элементов.

function mode () {
  var arr = [].slice.call(arguments);
  if ((args.length == 1) && (typeof args[0] === "object")) {
    args = args[0].mode();
  }

  var obj = {};
  for(var i = 0; i < arr.length; i++) {
    if(obj[arr[i]] === undefined) obj[arr[i]] = 1;
    else obj[arr[i]]++;
  }

  var max = 0;
  for (w in obj) {
    if (obj[w] > max) max = obj[w];
  }

  ret_val = [];
  for (w in obj) {
    if (obj[w] == max) ret_val.push(w);
  }

  return ret_val;
}
...