widzę, że każdy trochę inaczej podchodzi. Ja najpierw coś takiego zrobiłem:
https://jsfiddle.net/8gh1ub0a/
const a = [10, 20,10, 'kotek', 4, 6, 70, 'piesek', 200, 'małpka','kotek',13, 'kotek'];
const counts = new Map();
a.forEach(item => {
counts.set(item, (counts.get(item) || 0) + 1);
})
const max = Array.from(counts.entries()).reduce((max, entry) => (
entry[1] > max[1]? entry : max
));
console.log(max)
Ale teraz myślę, że ta druga pętla (reduce) nie jest potrzebna, bo można by sprawdzać już w pierwszej pętli (w forEach), czy coś jest największe. A mniej pętli = lepiej. Czyli powyższy kod można skrócić:
const a = [10, 20, 10,'kotek', 4, 6, 70, 'piesek', 200, 'małpka','kotek',13, 'kotek'];
const counts = new Map();
let max = [null, -1];
a.forEach(item => {
const count = (counts.get(item) || 0) + 1;
counts.set(item, count);
if (count > max[1]) max = [item, count];
})
console.log(max)
https://jsfiddle.net/ta0wxdpy/1/
krok po kroku,
Mój sposób krok po kroku:
- stwórz "słownik" (u mnie: obiekt Map https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map ale to zależy od implementacji). Ten słownik będzie trzymał liczbę wystąpień dla każdej wartości (klucze w słowniku to wartości w oryginalnej tablicy, a wartości w słowniku reprezentują liczby wystąpień).
- iteruj po tablicy i sprawdzaj w słowniku ile jest wystąpień dla danej wartości (
counts.get(item) || 0
), i zwiększaj o 1 i zapisuj do słownika zwiększoną wartość.
- sprawdź czy aktualna liczba wystapień jest największa jaka była do tej pory. Jeśli tak, to przypisz parę [wartość, liczba_wystapień] do zmiennej
max
:
if (count > max[1]) max = [item, count];
i na końcu w zmiennej max
będziesz mieć dwuelementową tablicę z najbardziej popularną wartością i liczbą wystapień.