Pobierz element o najwyższym wystąpieniu w tablicy


85

Szukam eleganckiego sposobu na określenie, który element ma największe wystąpienie ( tryb ) w tablicy JavaScript.

Na przykład w

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

'apple'elementem jest najczęściej jeden.


Możesz dostosować kilka pomysłów z tego pytania Stackoverflow. stackoverflow.com/questions/840781/…
Nosredna

Nie czytałem rozwiązań zbyt dokładnie, ale czy którekolwiek z nich zawiera następujący niuans (optymalizacja?), Oparty na wymaganiu jedynie określenia, który element ma najwięcej wystąpień, a nie ile wystąpień jest najwięcej .... a niuans jest taki, że ponieważ tablica jest zapętlona, ​​zliczanie może się zatrzymać, gdy różnica między najwyższym a drugim co do wielkości wystąpieniem jest mniejsza niż liczba elementów pozostałych do zapętlenia, zapętlenie może ustać, najwyższy prąd będzie najwyższy
Dexygen,

1
Również te rozwiązania wydają się nie uwzględniać więzi.
Dexygen

1
Jeśli szukasz innego rozwiązania (które jest trochę mniejsze) stackoverflow.com/questions/40410470/ ...
daanvanham

Odpowiedzi:


94

To tylko tryb. Oto szybkie, niezoptymalizowane rozwiązanie. Powinno być 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
Fajnie ... ale działa tylko w przypadku strun - niekoniecznie ograniczenie, ale coś do rozważenia.
James

Wielkie dzięki, nie spodziewałem się kompletnego rozwiązania. Działa zarówno na łańcuchach, jak i na liczbach za pomocą jednego przebiegu, co jest całkiem niezłe.
imadło

1
Dodałem wersję tego algorytmu do obsługi więzi.
samandmoore

3
Musiałem zamienić `f (modeMap [el] == null) na if (! ModeMap [el]), ponieważ nurkowało mnie z liczbą wierdową podczas przekazywania [2, 3, 3], ponieważ modeMap [el] był niezdefiniowany, a nie zerowy.
Naz

1
Myślę, że rozsądne jest posiadanie rozstrzygającego remisu, który w tym przypadku jest pierwszym elementem tablicy. Ale możesz łatwo zmienić ten algorytm, aby dać każdemu remis za większość.
Wylliam Judd

62

Od 2009 roku nastąpił rozwój javascript - pomyślałem, że dodam inną opcję. Mniej przejmuję się wydajnością, dopóki faktycznie nie stanowi to problemu, więc moja definicja „eleganckiego” kodu (zgodnie z zaleceniami OP) sprzyja czytelności - co jest oczywiście subiektywne ...

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

W tym konkretnym przykładzie, jeśli dwa lub więcej elementów zestawu ma równe wystąpienia, zostanie zwrócony ten, który pojawia się jako ostatni w tablicy. Warto również zauważyć, że zmodyfikuje to twoją oryginalną tablicę - czemu można zapobiec, jeśli chcesz, Array.slicewcześniej wykonując połączenie.


Edycja: zaktualizowałem przykład kilkoma grubymi strzałkami ES6, ponieważ wydarzył się rok 2015 i myślę, że wyglądają ładnie ... Jeśli obawiasz się kompatybilności wstecznej, możesz to znaleźć w historii wersji .


To jest świetne! Jak byś zwrócił wiele odpowiedzi, jeśli w tablicy jest więcej niż jeden element, który występuje tak samo jak inny?
Crystal

Jest naiwny, ponieważ zakłada, że ​​tryb jest wyjątkowy, jeśli chcesz, aby zwracał więcej niż jeden, musisz śledzić całkowitą liczbę każdego przedmiotu, który nie wygląda tak ładnie ... możesz spróbować czegoś takiego , jest to uproszczone, ponieważ będzie działać tylko z prymitywnymi wartościami (ale w razie potrzeby możesz je dostosować).
Emisariusz

14
Jeśli to nie jest elegancki kod, nie wiem, co to jest. To jest jak reklama programowania funkcjonalnego.
Sam H.

1
@GoranJakovljevic Czy możesz być bardziej szczegółowy? Wyobrażam sobie, że to funkcje strzałek ES6 - czy próbowałeś wcześniej kompatybilnego przykładu w historii wersji?
Emissary

Masz rację, jego funkcje strzałkowe. Tak, wstecz działa dobrze.
Goran Jakovljevic,

37

Jak na George Jempty's prośbą o uwzględnienie powiązań algorytmu proponuję zmodyfikowaną wersję Matthew Flaschen'salgorytmu.

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

To teraz zwróci ciąg z elementami trybu oddzielonymi znakiem & symbolem. Po otrzymaniu wyniku można go podzielić na ten &element i masz swój tryb (y).

Inną opcją byłoby zwrócenie tablicy elementów trybu w następujący sposób:

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

W powyższym przykładzie byłbyś wtedy w stanie obsłużyć wynik funkcji jako tablicę trybów.


1
W drugim przykładzie (tablica); nie trzeba do zestawu modes, aby [array[0]]jako wartości początkowej. Zapewni to, że masz duplikaty w modes. To powinno załatwić var modes = []
sprawę

1
To jest świetne! Jednak gdy testuję to z tablicą z dwiema różnymi wartościami, zwraca dwukrotnie pierwszy element tablicy. Nie wiem, dlaczego tak się dzieje ...
Kryształ

@xgrioux wprowadź zmianę, którą vdclouis zaleca, aby przeciwdziałać temu błędowi. tj. zmień [tablicę [0]] na [].
Dave Haigh

zaleca zmianę instancji ==na, ===aby wymusić ścisłą równość
Len Joseph

16

Opierając się na odpowiedzi Emissary z ES6 +, możesz użyć Array.prototype.reducedo porównania (w przeciwieństwie do sortowania, wyskakiwania i potencjalnej mutacji tablicy), które moim zdaniem wygląda całkiem sprytnie.

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

Domyślnie jestem na null, co nie zawsze da ci prawdziwą odpowiedź, jeśli null jest możliwą opcją, według której filtrujesz, może to być opcjonalny drugi argument

Wadą, podobnie jak w przypadku różnych innych rozwiązań, jest to, że nie obsługuje on „stanów rysowania”, ale nadal można to osiągnąć przy nieco bardziej zaangażowanej funkcji redukcji.


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

To wciąż jest O (n), ale niepotrzebnie wykorzystuje dwa przejścia.
Matthew Flaschen

2
Ponieważ przesyłany jest JavaScript, zawsze interesujące jest zobaczenie małych rozwiązań.
Nosredna

Lol 2 minus za poprawne rozwiązanie;] poprawiłem niepotrzebnie dwa przejścia, robiłem to szybko, ale nadal działa i nadal jest najkrótszym rozwiązaniem.
Thinker

każdy dostęp do b zajmuje co najmniej log (len (b)), więc O (n) może być nieco optymistyczny
Nicolas78

nicolas78: Jeśli tablica jest mała, nie ma to znaczenia. Więc to zależy od twojego projektu.
Thinker

7

Ponieważ używam tej funkcji jako quizu dla ankieterów, publikuję moje rozwiązanie:

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

Wypróbowuję tutaj podejście deklaratywne. To rozwiązanie tworzy obiekt, który zlicza wystąpienia każdego słowa. Następnie filtruje obiekt do tablicy, porównując całkowitą liczbę wystąpień każdego słowa z najwyższą wartością znalezioną w obiekcie.

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

Wyjaśnij proszę swoją odpowiedź
Haris,

Uniknąłbym obliczania maksimum w pętli filtra i usunąłbym instrukcję mapowania kluczy do wartości. Chociaż ta odpowiedź nie jest najbardziej wydajna, nie jest tak zła jak filtrowanie w reduktorze i jest ładna i czytelna imho. const maxValue = Math.max (... Object.values ​​(totals)); const results = keys.filter (x => totals [x] === maxValue);
milesaron

3

Czas na inne rozwiązanie:

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

Jeśli zwięzłość ma znaczenie (nie ma), to:

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

Jeśli chcesz uniknąć nieistniejących elementów (np. Rzadkiej tablicy), wymagany jest dodatkowy test 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

Inne odpowiedzi tutaj zwrócą wartość niezdefiniowaną .


@ Jonah - zwięzłość sama w sobie jest bezcelowa i zwykle utrudnia czytanie i utrzymywanie kodu. Oczywiście bardziej rozwlekły kod niekoniecznie jest lepszy tylko dlatego, że jest dłuższy. Ale te kryteria same w sobie są omijane przez znacznie ważniejsze środki, takie jak przejrzystość i łatwość konserwacji.
RobG

Oczywiście celem nigdy nie jest gęsta, tajemnicza zwięzłość. Ale ogólnie biorąc, biorąc pod uwagę dwie wersje tego samego kodu z mniej więcej równą gęstością, krótsza jest zwykle wyraźniejsza i lepsza. Nie mówię, że to reguła , ale korelacja jest silna. W rzeczywistości powiedziałbym, że nie ma innego pojedynczego wskaźnika tak silnie skorelowanego z czytelnością. Dlatego każdy programista uwielbia usuwać kod. Dlatego większość przeróbek w Code Review jest krótszych niż oryginał.
Jonasz


3

Oto inny sposób w ES6 na zrobienie tego ze złożonością 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
}

Problem z tym rozwiązaniem polega na tym, że słowa „max” i „mode” nie będą się liczyć, ponieważ jest to część logiki mapy ...
Pablo,

2

Oto moje rozwiązanie tego problemu, ale z liczbami i nową funkcją „Ustaw”. Nie jest zbyt wydajny, ale zdecydowanie dobrze się bawiłem, pisząc to i obsługuje wiele maksymalnych wartości.

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]

Nawiasem mówiąc, nie używaj tego do produkcji, to tylko ilustracja tego, jak można to rozwiązać za pomocą tylko funkcji ES6 i Array.


2

Oto moje rozwiązanie: -

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

Ze względu na naprawdę łatwy do odczytania i łatwego w utrzymaniu kod udostępniam to:

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

Mam nadzieję, że to komuś pomoże;)!


2

To rozwiązanie może zwrócić wiele elementów tablicy w przypadku remisu. Na przykład tablica

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

ma dwie wartości trybu: 3i 6.

Oto rozwiązanie.

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;

Uwaga: ct to długość tablicy.

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

Spróbuj też, to nie dotyczy wersji przeglądarki konta.

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

Zwróć uwagę, że ta funkcja zwraca ostatnie wystąpienie w tablicy, gdy 2 lub więcej wpisów pojawia się tyle samo razy!


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

Oto nowoczesna wersja wykorzystująca wbudowane mapy (więc działa nie tylko na rzeczach, które można przekonwertować na unikalne ciągi):

'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

Myślę, że masz dwa podejścia. Oba mają zalety.

Sortuj, a następnie Policz lub Zapętlaj i użyj tabeli skrótów, aby policzyć za Ciebie.

Tablica hashy jest fajna, ponieważ po zakończeniu przetwarzania masz również wszystkie odrębne elementy. Gdybyś miał jednak miliony elementów, tabela skrótów mogłaby zająć dużo pamięci, jeśli współczynnik powielania jest niski. Metoda sortowania, a następnie liczenia miałaby znacznie bardziej kontrolowany ślad pamięci.


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

Możesz spróbować tego:

 // 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

Możesz rozwiązać to w złożoności 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" );

Po prostu skopiuj i wklej w konsoli chrome, aby uruchomić powyższy kod.


0

Ta funkcja jest funkcją ogólną dla każdego typu informacji. Zlicza wystąpienia elementów, a następnie zwraca tablicę z maksymalną liczbą występujących elementów.

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

Oto moja droga. Próbuję grupować dane.

const _ = require("underscore")

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

Wynik groupResult powinien być

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

Następnie znajdź właściwość, która ma najdłuższą tablicę

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

Wygląda jak cały kod

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

W ES6 możesz połączyć metodę w następujący sposób:

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

Jeśli dwa elementy mają to samo wystąpienie, zwróci oba z nich. Działa z każdym rodzajem elementu.


nie należy używać zmiennej arrw zakresie, w którym ta zmienna jest już zdefiniowana jako parametr. Może to prowadzić do błędów w zależności od używanej przeglądarki.
mesqueeb

Który arrjest określony arr.indexOf(cur)? Górny parametr, czy ten wewnątrz redukuj ??
mesqueeb
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.