Сначала получите все дубликаты с помощью filter()
, а затем с помощью reduce()
получите индексы только тех элементов массива, которые находятся в dups
const arr = [12,30,30,60,11,12,30];
const dups = arr.filter(x => arr.indexOf(x) !== arr.lastIndexOf(x));
const res = arr.reduce((ac, a, i) => {
if(dups.includes(a)){
ac.push(i)
}
return ac;
}, []);
console.log(res)
Временная сложность вышеуказанного алгоритма составляет O(n^2)
. Если вы хотите O(n)
, вы можете использовать ниже способ
const arr = [12,30,30,60,11,12,30];
const dups = arr.reduce((ac, a) => (ac[a] = (ac[a] || 0) + 1, ac), {})
const res = arr.reduce((ac, a, i) => {
if(dups[a] !== 1){
ac.push(i)
}
return ac;
}, []);
console.log(res)