Artem3677
@Artem3677
Учусь

Сравнить элементы массива js и отфильтровать если будет более 3-х дублей одного элемента?

Необходимо сделать функцию, которая параметром будет принимать массив и удалять из него все дубли, которые встречаются больше трех раз. Попробовал так:
let arr = [1, true, 1, 'null', 1, '2', '1', true, 1, true, 'null', true, 'null'];
let res = arr.filter((el) => {
	if ((el === el) < 4) {
		return true;
	} else {
		return false;
	}
	});

console.log(res);

Без результата.
  • Вопрос задан
  • 193 просмотра
Решения вопроса 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
Представим, что нам нужно реализовать самый замороченный вариант: важны типы данных, порядок элементов должен сохраняться, а код должен быть понятным.
Выкидываем значение полностью

Исправленный код из вопроса:
let arr = [1, true, 1, 'null', 1, '2', '1', true, 1, true, 'null', true, 'null'];
let res = arr.filter((el) => arr.filter((i) => i === el).length <= 3);

console.log(res); // ['null', '2', '1', 'null', 'null']


Или мой чуть более упоротый вариант:
function solution(input, threshold = 3) {
    let counter = new Map();

    input.forEach((item) => {
        let prevCount = counter.get(item) || 0;

        counter.set(item, prevCount + 1);
    })

    let valid = [];

    counter.entries().forEach(([item, count]) => {
        if (count <= threshold) {
            valid.push(item);
        }
    });

    return input.filter((item) => valid.includes(item));
}

let arr = [1, true, 1, 'null', 1, '2', '1', true, 1, true, 'null', true, 'null'];
console.log(solution(arr)); // ['null', '2', '1', 'null', 'null']


Оставляем только первые N значений
function solution(input, threshold = 3) {
    let result = [];
    
    let counter = new Map();

    input.forEach((item) => {
        let prevCount = counter.get(item) || 0;
        let count = prevCount + 1;

        counter.set(item, count);

        if (count <= threshold) {
            result.push(item);
        }
    })

    return result;
}

let arr = [1, true, 1, 'null', 1, '2', '1', true, 1, true, 'null', true, 'null'];
console.log(solution(arr)); // [1, true, 1, 'null', 1, '2', '1', true, true, 'null', 'null']
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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