Remove parent if it doesn't have a child with specific class

Viewed 474

I have a code like this:

<div class='parent one'>
  <div class='yes'></div>
  <div class='yes'></div>
  <div class='yes'></div>
</div>

<div class='parent two'>
  <div></div>
  <div></div>
  <div></div>
</div>

<div class='parent three'>
  <div></div>
  <div></div>
  <div class='yes'></div>
</div>

How do I remove .parent.two because it doesn't have any child with .yes? What I've tried so far and it didn't work:

$('.parent div:not(.yes)').remove();
5 Answers

You can use :not with :has:

$(() => $('.parent:not(:has(.yes))').remove())
.parent{ background: orange; height: 100px; width: 100px; margin: 10px; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class='parent one'>
  <div class='yes'>Child of one</div>
  <div class='yes'>Child of one</div>
  <div class='yes'>Child of one</div>
</div>

<div class='parent two'>
  <div>Child of two</div>
  <div>Child of two</div>
  <div>Child of two</div>
</div>

<div class='parent three'>
  <div>Child of three</div>
  <div>Child of three</div>
  <div class='yes'>Child of three</div>
</div>

You could create a selector as a combination of :not and :has and then use remove method. So this will select all elements with .parent class that do not have child element with .yes class.

$('.parent:not(:has(.yes))')

$('.parent:not(:has(.yes))').remove()
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class='parent one'>
  <div class='yes'>one</div>
  <div class='yes'></div>
  <div class='yes'></div>
</div>

<div class='parent two'>
  <div>two</div>
  <div></div>
  <div></div>
</div>

<div class='parent three'>
  <div>three</div>
  <div></div>
  <div class='yes'></div>
</div>

this is how you can do with vanilla js

document.querySelectorAll(".parent").forEach(ele => {
  if (ele.querySelector(".yes") == null) {
    ele.remove();
  }
})

//for checking
document.querySelectorAll(".parent").forEach(ele => {
  console.log(ele)
})
<div class='parent one'>
  <div class='yes'></div>
  <div class='yes'></div>
  <div class='yes'></div>
</div>

<div class='parent two'>
  <div></div>
  <div></div>
  <div></div>
</div>

<div class='parent three'>
  <div></div>
  <div></div>
  <div class='yes'></div>
</div>

You can achieve that in many ways. The basic approaches are :

Directly selecting :

$('.parent.two').remove();

Selecting on the basis of it's index :

$('.parent:eq(1)').remove();

On the basis of presence of .yes element as child :

$('.parent div').not('.parent .yes').parent().remove();

Check the .innerHTML of each parent div to see if a child with that text exists and remove the parent if not.

document.querySelectorAll("div.parent").forEach(function(parentDiv){
  if(!parentDiv.innerHTML.includes('<div class="yes">')){
    parentDiv.remove();
  }
});
<div class='parent one'>1
  <div class='yes'></div>
  <div class='yes'></div>
  <div class='yes'></div>
</div>

<div class='parent two'>2
  <div></div>
  <div></div>
  <div></div>
</div>

<div class='parent three'>3
  <div></div>
  <div></div>
  <div class='yes'></div>
</div>

Related