@mletov

Как найти элементы, встречающиеся в массиве максимальное количество раз?

Пожалуйста, подскажите.
Пишу на TypeScript.
Есть массив вида
[1,1,1,1,1, 3,3,3,3,3, 5,5 ,6,6,6, 7,7,7,7,7]
Получить надо
[1,3,7]
Это элементы, встречающиеся максимальное количество раз.

Да, я знаю как решить эту задачу тупо в лоб, нагородив промежуточных массивов и циклов.
Но интересует какое-нибудь красивое и и эффективное решение. Как, например, в sql или linq, что-нибудь вроде group by, count, max и пр.
  • Вопрос задан
  • 176 просмотров
Решения вопроса 2
rockon404
@rockon404
Frontend Developer
const arr = [1,1,1,1,1, 3,3,3,3,3, 5,5 ,6,6,6, 7,7,7,7,7];

const map = {};
arr.forEach(el => map[el] = map[el] ? map[el] + 1 : 1);
const max = Math.max(...Object.values(map));
const result = Object.keys(map).filter(key => map[key] === max);

console.log(result); // [1 ,3, 7]
Ответ написан
Комментировать
const arr = [1,1,1,1,1, 3,3,3,3,3, 5,5 ,6,6,6, 7,7,7,7,7];

const calc = arr.reduce((prev, curr) => {
  const idx = prev.findIndex(item => item.val === curr);
  if (idx !== -1) {
    return ++prev[idx].count && prev;
  } else {
    return prev.push({ val: curr, count: 1 }) && prev;
  }
}, []);

const max = Math.max(...calc.map(i => i.count));
const result = calc.filter(i => i.count === max).map(i => i.val);

console.log(result); // [1, 3, 7]
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
djsv
@djsv
IT-генералист
Вариант с lodash:

const arr = [1,1,1,1,1, 3,3,3,3,3, 5,5 ,6,6,6, 7,7,7,7,7]
const items = _.countBy(arr) // {1: 5, 3: 5, 5: 2, 6: 3, 7: 5}
const max = _.max(_.toArray(items)) // 5
const result = []
_.forIn(items, (value, key) => {
  if (value === max) result.push(key)
})
Ответ написан
Комментировать
@webfln
[1,1,1,1,1, 3,3,3,3,3, 5,5 ,6,6,6, 7,7,7,7,7].filter((v, i, a) => a.indexOf(v) === i);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы