Найти индексы всех повторяющихся записей в js - PullRequest
1 голос
/ 13 марта 2020

Предположим, у меня есть массив, как показано ниже:

Arr1 = [12,30,30,60,11,12,30]

Мне нужно найти индекс элементов, которые повторяются в массиве, например,

ans: 0,1,2,5,6

Я пробовал это код, но он рассматривает только один элемент для проверки дубликатов.

Ответы [ 5 ]

6 голосов
/ 13 марта 2020

Сначала получите все дубликаты с помощью 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)
1 голос
/ 13 марта 2020

Немного другой подход с объектом в качестве замыкания для видимых элементов, который содержит массив индекса и первый массив, в котором позже идет индекс и необходимое выравнивание значений.

Это Ответ основан на вопросе, как можно вставить значение в уже сопоставленное значение.

Это возможно только при использовании ссылки на объект, которая сохраняется в момент появления значения и которого не видно before.

Пример незавершенного результата

[
    [0],
    [1],
    2,
    [],
    [],
    5,
    6
]

Финальный Array#flat удаляет покрывающий массив и показывает только индекс или ничего, если массив остается пустым .

[0, 1, 2, 5, 6]

var array = [12, 30, 30, 60, 11, 12, 30],
    indices = array
        .map((o => (v, i) => {
            if (o[v]) {               // if is duplicate
                o[v][1][0] = o[v][0]; // take the first index as well
                return i;             // return index
            } 
            o[v] = [i, []];           // save index
            return o[v][1];           // return empty array
        })({}))
        .flat()                       // remove [] and move values out of array

console.log(indices);
0 голосов
/ 13 марта 2020

Ниже кода будет самый простой способ найти индексы повторяющихся элементов

var dupIndex = [];
$.each(Arr1, function(index, value){
    if(Arr1.filter(a => a == value).length > 1){ dupIndex.push(index); }
});

Это должно работать для вас

0 голосов
/ 13 марта 2020

Вы можете использовать простые indexOf и l oop, чтобы получить дубликаты индексов.

let arr = [12,30,30,60,11,12,30]
let duplicate = new Set();
for(let i = 0; i < arr.length; i++){
    let index = arr.indexOf(arr[i], i + 1);
    if(index != -1) {
      duplicate.add(i);
      duplicate.add(index);
    }
}

console.log(Array.from(duplicate).sort().toString());
0 голосов
/ 13 марта 2020

Вы можете использовать Array#reduce метод

  1. l oop массив с reduce. В то время найти индекс аргумента
  2. И проверить, существуют ли аргументы больше чем один в массиве, используя Array#filter
  3. Окончательно pu sh значение индекса в новый массив accumulator. Если значение индекса уже существует в accmalator. Затем передайте currentIndex curInd массива в аккумулятор

const arr = [12, 30, 30, 60, 11, 12, 30];

let res = arr.reduce((acc, b, curInd) => {
  let ind = arr.indexOf(b);
  if (arr.filter(k => k == b).length > 1) {
    if (acc.indexOf(ind) > -1) {
      acc.push(curInd)
    } else {
      acc.push(ind);
    }
  }
  return acc;
}, []);

console.log(res)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...