Задать вопрос
@ICE777

Как удалить одинаковые элементы но оставить один из них?

В одной браузерной игре есть баг он заключается в следующим ник игрока дублируется и засоряет топ, насколько я знаю это исключительно визуальный баг (то-есть в игре нету 10 игроков с таким же ником он исключительно в топе).

Как сделать чтоб убирало все дубликаты но при том чтоб ставился один ник?

<div class="top">
    <span class="nick">Jack</span> <!-- Допустим оригинал-->
    <span class="nick">Jack</span>
    <span class="nick">Jack</span>
    <span class="nick">Jack</span>
    <span class="nick">Mike</span>
</div>


Хотелось бы узнать как это сделать без использования JQuery, на чистом JS.
  • Вопрос задан
  • 290 просмотров
Подписаться 2 Простой 3 комментария
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
О каких элементах идёт речь:

const parent = document.querySelector('.top');
const elements = parent.children;

Удаляем:

parent.replaceChildren(...Array.prototype.filter.call(
  elements,
  function({ textContent: n }) {
    return !this.has(n) && this.add(n);
  },
  new Set
));

или

const { size: numUnique } = Array.prototype.reduce.call(
  elements,
  (acc, n) => acc.add(elements[acc.size].innerText = n.innerText),
  new Set
);

for (; elements[numUnique]; parent.lastElementChild.remove()) ;

или

parent.innerHTML = Array
  .from(new Set(Array.from(elements, n => n.outerHTML)))
  .join('');

или

Object
  .values(Array
    .from(elements)
    .reduce((acc, n) => ((acc[n.innerText] ??= []).push(n), acc), {}))
  .forEach(n => n.forEach((m, i) => i && parent.removeChild(m)));

или

[...elements]
  .filter((n, i, a) => n !== a.find(m => m.innerText === n.innerText))
  .forEach(n => n.replaceWith());
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы