@rd100

Есть эффективный алгоритм поиска совпадений в массиве, если их болье 2 шт.?

Как можно сократить цикл поиска совпадений, если их может быть больше 2 шт.?
Например
let arr = [1, 2, 9, 12, 1, 24, 1, 9]
И нам нужно узнать, что единиц у нас 3 шт. , а девяток 2.
  • Вопрос задан
  • 203 просмотра
Решения вопроса 3
Alexandroppolus
@Alexandroppolus
кодир
function findAll(arr, matches) {
    for (let i = 0; i < arr.length; ++i) {
        const v = arr[i];
        const count = matches[v];
        if (count != null) {
            matches[v] = count + 1;
        }
    }
    return matches;
}

findAll([1, 2, 9, 12, 1, 24, 1, 9], {1: 0, 9: 0}); // {1: 3, 9: 2}
Ответ написан
@mikeyuriev
const arr = [1, 2, 9, 12, 1, 24, 1, 9];
const result = arr.reduce((acc, v) => ({...acc, [v]: (acc[v] || 0) + 1}), {});
Ответ написан
sergiks
@sergiks Куратор тега JavaScript
♬♬
Object.fromEntries(Object.entries(arr.reduce((acc, c) => (acc[c] = (acc[c] ?? 0) + 1, acc), {})).filter((pair) => pair[1] > 2)
вернёт объект {значение: счётчик} из элементов, которых «больше 2 шт». Для примера в вопросе вернёт {1: 3}, т.е. «единиц — было три»
Как работает

reduce()'ом проходим по массиву, собирая словарь, где ключи – уникальные значения из массива, а значения – счётчики, сколько раз каждое встретилось.
Затем разбираем объект в массив пар [ключ, значение]; фильтруем, оставляя только те, где значение > 2, и снова собираем в объект.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы