Отримати елемент із найбільшим входженням у масив


85

Я шукаю елегантний спосіб визначити, який елемент має найвищу частоту ( режим ) у масиві JavaScript.

Наприклад, в

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

'apple'елемент є найбільш частою один.


Ви можете адаптувати деякі ідеї з цього питання про Stackoverflow. stackoverflow.com/questions/840781 / ...
Nosredna

Я не надто уважно читав рішення, але чи включає будь-яке з них такий нюанс (оптимізація?), Виходячи з вимоги просто визначити, який елемент має найбільше випадків, а не скільки випадків найбільше .... і цей нюанс полягає в тому, що, коли масив зациклено, підрахунок може зупинитися, коли різниця між найвищим та другим найвищими випадками менше, ніж кількість елементів, залишених для циклічного перемикання, цикл може припинитися, поточний найвищий буде найбільшим
Dexygen

1
Також ці рішення, здається, не враховують зв'язків.
Dexygen

1
У разі , якщо ви шукаєте інше рішення (що трохи менше) stackoverflow.com/questions/40410470 / ...
daanvanham

Відповіді:


94

Це лише режим. Ось швидке, не оптимізоване рішення. Це має бути O (n).

function mode(array)
{
    if(array.length == 0)
        return null;
    var modeMap = {};
    var maxEl = array[0], maxCount = 1;
    for(var i = 0; i < array.length; i++)
    {
        var el = array[i];
        if(modeMap[el] == null)
            modeMap[el] = 1;
        else
            modeMap[el]++;  
        if(modeMap[el] > maxCount)
        {
            maxEl = el;
            maxCount = modeMap[el];
        }
    }
    return maxEl;
}

1
Приємно ... але це працює лише для рядків - не обов'язково обмеження, але щось, що слід врахувати.
Джеймс

Велике спасибі, я не очікував повного рішення. Працює як на рядках, так і на числах лише за один прохід, що досить приємно.
лещата

1
Я додав версію цього алгоритму для обробки зв'язків.
samandmoore

3
Мені довелося замінити `f (modeMap [el] == null) на if (! ModeMap [el]), оскільки він піднімав мені дивний номер при передачі [2, 3, 3], оскільки modeMap [el] не визначений як null.
Naz

1
Я думаю, що розумно мати вимикач, який у цьому випадку є елементом, який стоїть першим у масиві. Але ви могли б легко змінити цей алгоритм, щоб отримати більшість з них.
Вільям Джадд,

62

З 2009 року відбулися деякі розробки в javascript - я думав додати ще один варіант. Мене менше турбує ефективність, поки це насправді не є проблемою, тому моє визначення "елегантного" коду (як це передбачено OP) сприяє читаності - що, звичайно, суб'єктивно ...

function mode(arr){
    return arr.sort((a,b) =>
          arr.filter(v => v===a).length
        - arr.filter(v => v===b).length
    ).pop();
}

mode(['pear', 'apple', 'orange', 'apple']); // apple

У цьому конкретному прикладі, якщо два або більше елементів набору мають однакові випадки, тоді буде повернено той, який з’явиться останнім у масиві. Також варто зазначити, що це змінить ваш початковий масив - що можна запобігти, якщо ви хочете Array.sliceзаздалегідь зателефонувати.


Редагувати: оновив приклад деякими ES6 жировими стрілками, оскільки 2015 трапився , і я думаю, що вони виглядають досить ... Якщо вас турбує зворотна сумісність, ви можете знайти це в історії версій .


Це чудово! Тепер, як би ви повернули кілька відповідей, якщо в масиві є більше одного елемента, який зустрічається так само, як інший?
Кристал

Це наївно тим, що він припускає, що режим унікальний, якщо вам потрібно, щоб він повернув більше одного, то вам потрібно відстежувати загальну кількість для кожного предмета, який виглядає не так красиво ... ви можете спробувати щось подібне , це спрощено тим, що він буде працювати лише з примітивними значеннями (але ви можете додатково його адаптувати, якщо це потрібно).
Емісар

14
Якщо це не елегантний код, я не знаю, що таке. Це як реклама функціонального програмування.
Сем Х.

1
@GoranJakovljevic Чи можете ви бути більш конкретними? Я гадаю, це функції стрілок ES6 - ви пробували приклад, сумісний із зворотною історією в історії редагувань?
Емісар

Ви праві, його стрілка функціонує. Так, назад працює просто чудово.
Горан Яковлевич

37

Відповідно до George Jempty'sзапиту мати обліковий запис алгоритму для зв’язків, я пропоную модифіковану версію Matthew Flaschen'sалгоритму.

function modeString(array) {
  if (array.length == 0) return null;

  var modeMap = {},
    maxEl = array[0],
    maxCount = 1;

  for (var i = 0; i < array.length; i++) {
    var el = array[i];

    if (modeMap[el] == null) modeMap[el] = 1;
    else modeMap[el]++;

    if (modeMap[el] > maxCount) {
      maxEl = el;
      maxCount = modeMap[el];
    } else if (modeMap[el] == maxCount) {
      maxEl += "&" + el;
      maxCount = modeMap[el];
    }
  }
  return maxEl;
}

Це поверне рядок із елементами режиму, розділеними &символом. Коли результат отримано, його можна розділити на цей &елемент, і у вас є свій режим (и).

Іншим варіантом було б повернути масив елементів режиму таким чином:

function modeArray(array) {
  if (array.length == 0) return null;
  var modeMap = {},
    maxCount = 1,
    modes = [];

  for (var i = 0; i < array.length; i++) {
    var el = array[i];

    if (modeMap[el] == null) modeMap[el] = 1;
    else modeMap[el]++;

    if (modeMap[el] > maxCount) {
      modes = [el];
      maxCount = modeMap[el];
    } else if (modeMap[el] == maxCount) {
      modes.push(el);
      maxCount = modeMap[el];
    }
  }
  return modes;
}

У наведеному вище прикладі ви зможете обробляти результат функції як масив режимів.


1
У другому прикладі (масив один); Вам не потрібно встановлювати modesв [array[0]]якості початкового значення. Це забезпечить наявність копій modes. Це повинно зробити трюкvar modes = []
vdclouis

1
Це чудово! Однак, коли я тестую це за допомогою масиву з двома різними значеннями, він двічі повертає перший елемент масиву. Не знаю, чому це відбувається ...
Кристал

@xgrioux внести зміни, які vdclouis рекомендує протидіяти цій помилці. тобто змінити [масив [0]] на [].
Dave Haigh

рекомендуємо змінити інстанції ==на ===для забезпечення суворої рівності
Лен Джозеф

16

На основі Емісар ES6 + відповідь «s, ви могли б використовувати , Array.prototype.reduceщоб зробити ваше порівняння (на відміну від сортування, поппінг і потенційно мутує ваш масив), який я думаю , виглядає досить слизьким.

const mode = (myArray) =>
  myArray.reduce(
    (a,b,i,arr)=>
     (arr.filter(v=>v===a).length>=arr.filter(v=>v===b).length?a:b),
    null)

Я за замовчуванням отримую значення null, яке не завжди дасть вам правдиву відповідь, якщо null - це можливий варіант, який ви фільтруєте, можливо, це може бути необов’язковим другим аргументом

Недоліком, як і у випадку з різними іншими рішеннями, є те, що він не справляється з "станами витягування", але цього все одно можна досягти за допомогою трохи більш задіяної функції зменшення.


14
a=['pear', 'apple', 'orange', 'apple'];
b={};
max='', maxi=0;
for(let k of a) {
  if(b[k]) b[k]++; else b[k]=1;
  if(maxi < b[k]) { max=k; maxi=b[k] }
}

Це все ще O (n), але воно без потреби використовує два проходи.
Matthew Flaschen

2
Оскільки JavaScript передається, завжди цікаво бачити невеликі рішення.
Nosredna

Lol 2 мінус для правильного рішення;] Я виправив непотріб два проходи, робив це швидко, але все одно це працює і все ще є найкоротшим рішенням.
Мислитель

кожен доступ до b займає принаймні журнал (len (b)), тому O (n) може бути дещо оптимістичним
Nicolas78

nicolas78: Якщо масив невеликий, це не має значення. Тож це залежить від вашого проекту.
Мислитель

7

Оскільки я використовую цю функцію як вікторину для інтерв'юерів, я публікую своє рішення:

const highest = arr => (arr || []).reduce( ( acc, el ) => {
  acc.k[el] = acc.k[el] ? acc.k[el] + 1 : 1
  acc.max = acc.max ? acc.max < acc.k[el] ? el : acc.max : el
  return acc  
}, { k:{} }).max

const test = [0,1,2,3,4,2,3,1,0,3,2,2,2,3,3,2]
console.log(highest(test))

5

Випробування декларативного підходу тут. Це рішення створює об'єкт для підрахунку випадків кожного слова. Потім фільтрує об’єкт до масиву, порівнюючи загальну кількість випадків кожного слова з найвищим значенням, знайденим в об’єкті.

const arr = ['hello', 'world', 'hello', 'again'];

const tally = (acc, x) => { 

  if (! acc[x]) { 
    acc[x] = 1;
    return acc;
  } 

  acc[x] += 1;
  return acc;
};

const totals = arr.reduce(tally, {});

const keys = Object.keys(totals);

const values = keys.map(x => totals[x]);

const results = keys.filter(x => totals[x] === Math.max(...values));

Поясніть свою відповідь, будь ласка
Харіс

Я б уникнув обчислення максимуму в циклі фільтрації та вилучив оператор мапи ключів до значень. Хоча ця відповідь не є найефективнішою, вона не така погана, як фільтрація в редукторі, і є приємною та читабельною. const maxValue = Math.max (... Object.values ​​(total)); const результати = keys.filter (x => підсумки [x] === maxValue);
Milesaron

3

Час для іншого рішення:

function getMaxOccurrence(arr) {
    var o = {}, maxCount = 0, maxValue, m;
    for (var i=0, iLen=arr.length; i<iLen; i++) {
        m = arr[i];

        if (!o.hasOwnProperty(m)) {
            o[m] = 0;
        }
        ++o[m];

        if (o[m] > maxCount) {
            maxCount = o[m];
            maxValue = m;
        }
    }
    return maxValue;
}

Якщо стислість має значення (це не має значення), тоді:

function getMaxOccurrence(a) {
    var o = {}, mC = 0, mV, m;
    for (var i=0, iL=a.length; i<iL; i++) {
        m = a[i];
        o.hasOwnProperty(m)? ++o[m] : o[m] = 1;
        if (o[m] > mC) mC = o[m], mV = m;
    }
    return mV;
}

Якщо потрібно уникати неіснуючих членів (наприклад, розріджений масив), необхідний додатковий тест hasOwnProperty :

function getMaxOccurrence(a) {
    var o = {}, mC = 0, mV, m;
    for (var i=0, iL=a.length; i<iL; i++) {
        if (a.hasOwnProperty(i)) {
            m = a[i];
            o.hasOwnProperty(m)? ++o[m] : o[m] = 1;
            if (o[m] > mC) mC = o[m], mV = m;
        }
    }
    return mV;
}

getMaxOccurrence([,,,,,1,1]); // 1

Інші відповіді тут повернуться невизначеними .


@ Йона - стислість сама по собі безглузда і зазвичай ускладнює читання та підтримку коду. Звичайно, більш детальний код не обов'язково кращий лише для того, щоб бути довшим. Але ці критерії самі по собі усуваються набагато важливішими заходами, такими як чіткість та ремонтопридатність.
RobG

Очевидно, щільна, загадкова стислість ніколи не є метою. Але загалом, враховуючи дві версії одного і того ж коду з приблизно однаковою щільністю, коротший, як правило, чіткіший і кращий. Я не кажу, що це правило , але кореляція сильна. Насправді, я б сказав, що немає жодного окремого показника, який би так корелював із читабельністю. Ось чому кожен програміст любить видаляти код. Ось чому більшість переробок у Code Review коротші за оригінал.
Йона

3

Ще одне рішення JS від: https://www.w3resource.com/javascript-exercises/javascript-array-exercise-8.php

Можна спробувати і це:

let arr =['pear', 'apple', 'orange', 'apple'];

function findMostFrequent(arr) {
  let mf = 1;
  let m = 0;
  let item;

  for (let i = 0; i < arr.length; i++) {
    for (let j = i; j < arr.length; j++) {
      if (arr[i] == arr[j]) {
        m++;
        if (m > mf) {
          mf = m;
          item = arr[i];
        }
      }
    }
    m = 0;
  }

  return item;
}

findMostFrequent(arr); // apple

3

Ось ще один спосіб ES6 зробити це зі складністю O (n)

const result = Object.entries(
    ['pear', 'apple', 'orange', 'apple'].reduce((previous, current) => {
        if (previous[current] === undefined) previous[current] = 1;
        else previous[current]++;
        return previous;
    }, {})).reduce((previous, current) => (current[1] >= previous[1] ? current : previous))[0];
console.log("Max value : " + result);

2
function mode(arr){
  return arr.reduce(function(counts,key){
    var curCount = (counts[key+''] || 0) + 1;
    counts[key+''] = curCount;
    if (curCount > counts.max) { counts.max = curCount; counts.mode = key; }
    return counts;
  }, {max:0, mode: null}).mode
}

Проблема цього рішення полягає в тому, що слова "max" і "mode" не будуть враховуватися, оскільки це частина логіки на карті ...
Пабло

2

Ось моє рішення цієї проблеми, але з цифрами та за допомогою нової функції "Встановити". Це не дуже ефективно, але я, безумовно, отримав велике задоволення від написання цього, і він підтримує кілька максимальних значень.

const mode = (arr) => [...new Set(arr)]
  .map((value) => [value, arr.filter((v) => v === value).length])
  .sort((a,b) => a[1]-b[1])
  .reverse()
  .filter((value, i, a) => a.indexOf(value) === i)
  .filter((v, i, a) => v[1] === a[0][1])
  .map((v) => v[0])

mode([1,2,3,3]) // [3]
mode([1,1,1,1,2,2,2,2,3,3,3]) // [1,2]

До речі, не використовуйте це для виробництва, це лише ілюстрація того, як ви можете вирішити це лише за допомогою функцій ES6 та Array.


2

Ось моє рішення: -

function frequent(number){
    var count = 0;
    var sortedNumber = number.sort();
    var start = number[0], item;
    for(var i = 0 ;  i < sortedNumber.length; i++){
      if(start === sortedNumber[i] || sortedNumber[i] === sortedNumber[i+1]){
         item = sortedNumber[i]
      }
    }
    return item
  
}

   console.log( frequent(['pear', 'apple', 'orange', 'apple']))


2

Заради справді легкого для читання коду, який можна підтримувати, я поділяю це:

function getMaxOcurrences(arr = []) {
  let item = arr[0];
  let ocurrencesMap = {};

  for (let i in arr) {
    const current = arr[i];

    if (ocurrencesMap[current]) ocurrencesMap[current]++;
    else ocurrencesMap[current] = 1;

    if (ocurrencesMap[item] < ocurrencesMap[current]) item = current;
  }

  return { 
    item: item, 
    ocurrences: ocurrencesMap[item]
  };
}

Сподіваюся, це комусь допоможе;)!


2

Це рішення може повернути декілька елементів масиву у випадку зв’язку. Наприклад, масив

arr = [ 3, 4, 3, 6, 4, ];

має два значення режиму: 3і 6.

Ось рішення.

function find_mode(arr) {
    var max = 0;
    var maxarr = [];
    var counter = [];
    var maxarr = [];

    arr.forEach(function(){
       counter.push(0);
    });

    for(var i = 0;i<arr.length;i++){
       for(var j=0;j<arr.length;j++){
            if(arr[i]==arr[j])counter[i]++; 
       }
    } 


    max=this.arrayMax(counter);   
  
    for(var i = 0;i<arr.length;i++){
         if(counter[i]==max)maxarr.push(arr[i]);
    }

    var unique = maxarr.filter( this.onlyUnique );
    return unique;

  };


function arrayMax(arr) {
      var len = arr.length, max = -Infinity;
      while (len--) {
              if (arr[len] > max) {
              max = arr[len];
              }
      }
  return max;
 };

 function onlyUnique(value, index, self) {
       return self.indexOf(value) === index;
 }

1
var mode = 0;
var c = 0;
var num = new Array();
var value = 0;
var greatest = 0;
var ct = 0;

Примітка: ct - довжина масиву.

function getMode()
{
    for (var i = 0; i < ct; i++)
    {
        value = num[i];
        if (i != ct)
        {
            while (value == num[i + 1])
            {
                c = c + 1;
                i = i + 1;
            }
        }
        if (c > greatest)
        {
            greatest = c;
            mode = value;
        }
        c = 0;
    }
}

1
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'))

1
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;
}

1

Спробуйте теж, це не враховує версію браузера.

function mode(arr){
var a = [],b = 0,occurrence;
    for(var i = 0; i < arr.length;i++){
    if(a[arr[i]] != undefined){
        a[arr[i]]++;
    }else{
        a[arr[i]] = 1;
    }
    }
    for(var key in a){
    if(a[key] > b){
        b = a[key];
        occurrence = key;
    }
    }
return occurrence;
}
alert(mode(['segunda','terça','terca','segunda','terça','segunda']));

Зверніть увагу, що ця функція повертає останнє виникнення в масиві, коли 2 або більше записів з’являються однакову кількість разів!


1
// O(n)
var arr = [1, 2, 3, 2, 3, 3, 5, 6];
var duplicates = {};
max = '';
maxi = 0;
arr.forEach((el) => {
    duplicates[el] = duplicates[el] + 1 || 1;
  if (maxi < duplicates[el]) {
    max = el;
    maxi = duplicates[el];
  }
});
console.log(max);

1

Ось сучасна версія із використанням вбудованих карт (тому вона працює не лише на речі, які можна перетворити на унікальні рядки):

'use strict';

const histogram = iterable => {
    const result = new Map();

    for (const x of iterable) {
        result.set(x, (result.get(x) || 0) + 1);
    }

    return result;
};

const mostCommon = iterable => {
    let maxCount = 0;
    let maxKey;

    for (const [key, count] of histogram(iterable)) {
        if (count > maxCount) {
            maxCount = count;
            maxKey = key;
        }
    }

    return maxKey;
};

console.log(mostCommon(['pear', 'apple', 'orange', 'apple']));


0

Я думаю, у вас є два підходи. Обидва з них мають переваги.

Відсортуйте, потім підрахуйте або прокрутіть і використовуйте хеш-таблицю, щоб зробити підрахунок за вас.

Хеш-таблиця приємна, тому що, закінчивши обробку, у вас також є всі різні елементи. Якби у вас було мільйони елементів, хеш-таблиця могла б зайняти багато пам'яті, якщо рівень дублювання низький. Підхід сортування, тоді підрахунок матиме набагато більш керований слід пам'яті.


0
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

Ви можете спробувати це:

 // using splice()   
 // get the element with the highest occurence in an array
    function mc(a) {
      var us = [], l;
      // find all the unique elements in the array
      a.forEach(function (v) {
        if (us.indexOf(v) === -1) {
          us.push(v);
        }
      });
      l = us.length;
      while (true) {
        for (var i = 0; i < l; i ++) {
          if (a.indexOf(us[i]) === -1) {
            continue;
          } else if (a.indexOf(us[i]) != -1 && a.length > 1) {
            // just delete it once at a time
            a.splice(a.indexOf(us[i]), 1);
          } else {
            // default to last one
            return a[0];
          }
        }
      }
    }

// using string.match method
function su(a) {
    var s = a.join(),
            uelms = [],
            r = {},
            l,
            i,
            m;

    a.forEach(function (v) {
        if (uelms.indexOf(v) === -1) {
            uelms.push(v);
        }
    });

    l = uelms.length;

    // use match to calculate occurance times
    for (i = 0; i < l; i ++) {
        r[uelms[i]] = s.match(new RegExp(uelms[i], 'g')).length;
    }

    m = uelms[0];
    for (var p in r) {
        if (r[p] > r[m]) {
            m = p;
        } else {
            continue;
        }
    }

    return m;
}

0

Ви можете вирішити це в складності 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 console, щоб запустити наведений вище код.


0

Ця функція є загальною функцією для кожного типу інформації. Він підраховує входження елементів, а потім повертає масив з максимально можливими елементами.

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

0
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

Ось мій шлях. Я намагаюся згрупувати кулак даних.

const _ = require("underscore")

var test  = [ 1, 1, 2, 1 ];
var groupResult = _.groupBy(test, (e)=> e);

Результатом групи повинен бути

{
  1: [1, 1, 1]
  2: [2] 
}

Тоді знайдіть властивість, яка має найдовший масив

function findMax(groupResult){
   var maxArr = []
   var max;
   for(var item in groupResult){
     if(!max) { 
        max = { value:item, count: groupResult[item].length } ; 
        maxArr.push(max); 
        continue;
     }
     if(max.count < groupResult[item].length){ 
        maxArr = [];
        max = { value:item, count: groupResult[item].length }
        maxArr.push(max)
     } else if(max === groupResult[item].length)
        maxArr.push({ value:item, count: groupResult[item].length })
   }
   return maxArr;
}

Повний код виглядає так

const _ = require("underscore")

var test  = [ 1, 1, 2, 1 ];
var groupResult= _.groupBy(test, (e)=> e);
console.log(findMax(groupResult)[0].value);

function findMax(groupResult){
   var maxArr = []
   var max;
   for(var item in groupResult){
     if(!max) { 
        max = { value:item, count: groupResult[item].length } ; 
        maxArr.push(max); 
        continue;
     }
     if(max.count < groupResult[item].length){ 
        maxArr = [];
        max = { value:item, count: groupResult[item].length }
        maxArr.push(max)
     } else if(max === groupResult[item].length)
        maxArr.push({ value:item, count: groupResult[item].length })
   }
   return maxArr;
}

0
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);

0

За допомогою ES6 ви можете зв'язати метод наступним чином:

    function findMostFrequent(arr) {
      return arr
        .reduce((acc, cur, ind, arr) => {
          if (arr.indexOf(cur) === ind) {
            return [...acc, [cur, 1]];
          } else {
            acc[acc.indexOf(acc.find(e => e[0] === cur))] = [
              cur,
              acc[acc.indexOf(acc.find(e => e[0] === cur))][1] + 1
            ];
            return acc;
          }
        }, [])
        .sort((a, b) => b[1] - a[1])
        .filter((cur, ind, arr) => cur[1] === arr[0][1])
        .map(cur => cur[0]);
    }
    
    console.log(findMostFrequent(['pear', 'apple', 'orange', 'apple']));
    console.log(findMostFrequent(['pear', 'apple', 'orange', 'apple', 'pear']));

Якщо два елементи мають однакове входження, він поверне їх обидва. І це працює з будь-якими елементами.


ви не повинні використовувати змінну arrвсередині області, де ця змінна вже визначена як параметр. Це може призвести до помилок залежно від того, який браузер використовується.
mesqueeb

На що arrпосилається arr.indexOf(cur)? Верхній параметр, або той, що знаходиться всередині зменшення ??
mesqueeb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.