Это можно сделать, выполнив следующие действия:
- Создать функцию, которая принимает массив и не реже одного раза повторяет элемент в качестве аргумента.
- Удалите дубликаты измассив
Set
- Затем используйте
filter()
для этого.Внутри filter()
используйте filter()
в исходном массиве (с дублирующимися значениями), чтобы получить массив с такими же значениями. - Сравните длину этого массива с количеством (второй параметр)
var myArray = ["hi", "hi", "hi", "ha", "ha", "ho", "hu", "hu", "hu"];
const valWhichRepeat = (arr,count) =>
[...new Set(arr)].filter(x =>
arr.filter(a => a === x).length >= count
);
console.log(valWhichRepeat(myArray,3))
Приведенный выше код не имеет линейной сложности по времени.Если вам нужна временная сложность лайнера, вы можете использовать reduce()
для создания объекта с количеством элементов, а затем использовать filter()
для его ключей.
var myArray = ["hi", "hi", "hi", "ha", "ha", "ho", "hu", "hu", "hu"];
const valWhichRepeat = (arr,count) => {
const obj = arr.reduce((ac,a) => (ac[a] = ac[a] + 1 || 1,ac),{});
return Object.keys(obj).filter(x => obj[x] >= count);
}
console.log(valWhichRepeat(myArray,3))
Выше все еще используются две петли.Если вы хотите использовать только один цикл, вы можете push()
элементы внутри reduce()
var myArray = ["hi", "hi", "hi", "ha", "ha", "ho", "hu", "hu", "hu"];
const valWhichRepeat = (arr,count) =>
arr.reduce(([obj,res],a) => {
obj[a] = obj[a] + 1 || 1;
if(obj[a] === count) res.push(a);
return [obj,res]
},[{},[]])[1]
console.log(valWhichRepeat(myArray,3))