Split a nested list into separate lists

I have a nested list used in navigation. How can I use jquery to separate nested lists into separate lists with each nested list divided, but keeping a separate list along with the original title?

html:

<ul id="bigList">
  <li><a href="#">Diary products</a>
    <ul>
      <li><a href="#">Milk</a>
        <ul>
          <li><a href="#">Goat</a></li>
          <li><a href="#">Cow</a>
            <ul>
              <li><a href="#">Smelly</a></li>
              <li><a href="#">Extra smelly</a></li>
            </ul>
            <li><a href="#">Soya</a></li>
          </li>
        </ul>
      </li>
      <li><a href="#">Eggs</a></li>
      <li><a href="#">Cheese</a></li>
      <li><a href="#">Pasta</a></li>
    </ul>
  </li>
</ul>

Output Required:

  <ul>
   <li><a href="#">Diary Products</a>
    <ul>
      <li><a href="#">Milk</a></li>
      <li><a href="#">Eggs</a></li>
      <li><a href="#">Cheese</a></li>
      <li><a href="#">Pasta</a></li>
     </ul>
   </li>
  </ul>

  <ul>
    <li><a href="#">Milk</a>
      <ul>
        <li><a href="#">Goat</a></li>
        <li><a href="#">Cow</a></li>
        <li><a href="#">Soya</a></li>     
      </ul>
    </li>
   </ul>

    <ul>
      <li><a href="#">Cow</a>
        <ul>
          <li><a href="#">Smelly</a></li>
          <li><a href="#">Extra smelly</a></li>
        </ul>
      </li>
    </ul>

Javascript so far:

$(function () {
    var $bigList = $('#bigList'),
        group;
    while ((group = $bigList.find('li:lt(20)').remove()).length) {
        $('<ul/>').append(group).appendTo('body');
    }
});

Here is fiddle

http://jsfiddle.net/zEA5t/3/

+4
source share
2 answers

This simple little code can do this:

var myList = $('<ul>');

var $originalList = $('#bigList');

$originalList.find('li:has(li)').each(function(){
    var $this = $(this);

    $this.clone().appendTo(myList).find('>ul >li >ul').remove();
})

$('body').append(myList);

Fiddle: http://jsfiddle.net/zEA5t/6/

+6
source

Im using the selector ul> li> ul, displays the result in

$(function(){
    $('ul > li > ul').each(function(i){
        var clone = $(this).clone();
        clone.find('ul').remove();

        var clone2 = $(this).parent().clone();
        clone2.children('ul, li').remove();
        clone2.append(clone);

        var clone3 = $(this).parent().parent().clone();
        clone3.children('ul, li').remove();
        clone3.append(clone2);

        clone3.appendTo('#output');
    });
})
0
source

Source: https://habr.com/ru/post/1538411/


All Articles