Jak wyznaczyć element w tablicy, który występuje najczęściej?

0

Jest parę stron w necie, które pokazują jak zrobić to w js, ale nie jest opisane co i jak. Ma ktoś może jakiś przykład opisany co jest robione krok po kroku, lub wie gdzie to znaleźć? Bo na razie najlepsze co znalazłem to: https://www.oodlestechnologies.com/blogs/How-to-find-the-most-repeated-item-of-an-array-in-javascript/

Może ma ktoś coś rozpisanego lepiej?

3

Jak zrobiłbyś to ręcznie, na kartce?

1
const mostFrequent = arr =>
  Object.entries(
    arr.reduce((acc, i) => {
      acc[i] = acc[i] ? acc[i] + 1 : 1;
      return acc;
    }, {})
  ).reduce((accumulator, item) => (item[1] >= accumulator[1] ? item : accumulator), [null, 0])[0];

Napisałbym to w powyższy sposób. Wewnętrzny reduce tworzy obiekt w którym argumentami są unikalne wartości z danej tablicy, wartością argumentu jest częstotliwość występowania. Object.entries() tworzy listę argumentów przekazanego obiektu czyli w naszym przypadku listę par (wartość, ilość). Zewnętrzny reduce porównuje kolejno każdą parę (wartość, ilość) z parą (wartość, ilość) zapisaną w akumulatorze. Jeżeli kolejna para jest większa od tej w akumulatorze, to ją podmienia. Na koniec zwraca wartość, która została na koniec w akumulatorze.

1
arr = [3, 'a', 'a', 'a', 2, 3, 'a', 3, 'a', 2, 4, 9, 3];
arr.sort();

key_max = "";
max     = 0;

for (var i = 0; i < arr.length; i++) {
  if (arr[i] != arr[i-1]) {max_loc = 1;} else {max_loc++;}
  if (max_loc > max) {
    key_max = arr[i];
    max     = max_loc;
  }
}

console.log(key_max, max);
2

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ń.

1 użytkowników online, w tym zalogowanych: 0, gości: 1