Задать вопрос
@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.
  • Вопрос задан
  • 250 просмотров
Подписаться 2 Простой 3 комментария
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
document.querySelectorAll('.top > .nick').forEach(function(n) {
  const text = n.textContent;
  !this.has(text) && this.add(text) || n.remove();
}, new Set);

или

[...document.querySelector('.top').children].reduce((acc, n) => {
  const text = n.innerText;
  acc.includes(text) ? n.parentNode.removeChild(n) : acc.push(text);
  return acc;
}, []);

или

Object
  .values(Array
    .from(document.querySelectorAll('.top > .nick'))
    .reduce((acc, n) => ((acc[n.innerText] ??= []).push(n), acc), {}))
  .forEach(n => n.forEach((m, i) => i && (m.outerHTML = '')));

или

const el = document.querySelector('.top');
el.innerHTML = [...new Set(el.innerHTML.match(/<span.*?\/span>/g) ?? [])].join(' ');

или

const el = document.querySelector('.top');
el.innerHTML = Array
  .from(el.getElementsByClassName('nick'), n => n.innerText)
  .filter((n, i, a) => i === a.indexOf(n))
  .reduce((acc, n) => acc + (acc && ' ') + `<span class="nick">${n}</span>`, '');
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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