#javascript #html #foreach
#javascript #HTML #foreach
Вопрос:
Как удалить все повторяющиеся дочерние узлы из родительского элемента, чтобы в родительском элементе никогда не было более 1 элемента с одинаковым внутренним текстом? Приведенный ниже HTML-пример того, что такое before и предполагаемое after .
HTML
<div id="parent">
<div class="child">hello</div>
<div class="child">hello</div>
<div class="child">world</div>
<div class="child">world</div>
</div>
Цель
<div id="parent">
<div class="child">hello</div>
<div class="child">world</div>
</div>
Комментарии:
1. Можете ли вы заполнить свою попытку? Вам не так много, чтобы помочь, если мы не можем увидеть, что вы на самом деле пытались до сих пор.
2. Хотя я бы не стал изменять массив из его собственного
forEach
обработчика. Представьте, что может произойти, если вы удалите элемент во время итерации по нему? Вы можете попробовать другой встроенный массивfilter
, который может быть больше для вашего варианта использования.
Ответ №1:
Попробуйте это.
var children = document.querySelectorAll(".child")
var tmpTexts = []
for (const c of children) {
if (tmpTexts.includes(c.innerText)) continue
tmpTexts.push(c.innerText)
c.parentNode.removeChild(c)
}
<div id="parent">
<div class="child">hello</div>
<div class="child">hello</div>
<div class="child">world</div>
<div class="child">world</div>
</div>
Ответ №2:
Вот еще один способ сделать это:
const children = document.querySelectorAll('.child');
function filterChildren(text, i, textArray) {
if ( textArray.indexOf(text) <= textArray.lastIndexOf(text) amp;amp; textArray.indexOf(text) !== i ) {
children[i].parentNode.removeChild( children[i] )
}
}
Array
.from(children)
.map( child => child.innerHTML )
.forEach(filterChildren);
<div id="parent">
<div class="child">hello</div>
<div class="child">hello</div>
<div class="child">world</div>
<div class="child">world</div>
</div>