@Artemio95

Как найти дубликаты в массиве?

Имеется массив строк, любой, к примеру ['r', 'e', 'c', 'e', 'd', 'e'] или ['(', '(', ' ', '@']
Как найти повторяющийся элемент в массиве и на его место вставить, к примеру, true. А если элемент не повторился, вставить false. Т.е. в первом примере получилось бы [false, true, false, true, false, true], а во втором [true, true, false, false]
Я пробовал через вложенный цикл, но а) у меня не получилось б) скорость обработки возводится в степень, что плохо(
  • Вопрос задан
  • 1031 просмотр
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Собрать новый массив:

const newArr = Object
  .values(arr.reduce((acc, n, i) => ((acc[n] ??= []).push(i), acc), {}))
  .reduce((acc, n) => (n.forEach(i => acc[i] = n.length > 1), acc), []);

// или

const newArr = arr.map(function(n) {
  return this[n];
}, arr.reduce((acc, n) => (acc[n] = acc.hasOwnProperty(n), acc), {}));

// или

const count = arr.reduce((acc, n) => (acc[n] = (acc[n] ?? 0) + 1, acc), {});
const newArr = arr.map(n => count[n] > 1);

// или

const newArr = arr.map((n, i, a) => a.indexOf(n) !== a.lastIndexOf(n));

Обновить существующий:

arr.forEach(function(n, i, a) {
  a[i] = this.get(n) > 1;
}, arr.reduce((acc, n) => acc.set(n, -~acc.get(n)), new Map));

// или

const duplicates = arr.reduce((acc, n) => acc.set(n, acc.has(n)), new Map);
arr.splice(0, arr.length, ...arr.map(n => duplicates.get(n)));
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@jsnk
Программист
Создаешь асс массив. Ключи - значения в исходном массиве. Значения 0.
Просмотром исх массива в асс массиве меняешь значение на +1.
Если в асс массиве значение 1, повтора нет , иначе количество повторов.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
01 мая 2024, в 02:11
5000 руб./за проект
01 мая 2024, в 00:29
2000 руб./за проект
01 мая 2024, в 00:20
15000 руб./за проект