Jquery递归函数将嵌套的li合并为一个

use*_*904 2 javascript recursion jquery list

我试图使用jquery使用递归方法将嵌套的li转换为单个li

html如下

<ul>
   <li>item-1
      <ul>
         <li>item-1.1</li>
      </ul>
   </li>
   <li>item-2
     <ul>
       <li>item-2.1</li>
       <li>item-2.2
          <ul>
             <li>item-2.2.1</li>
             <li>item-2.2.2</li>
          </ul>
       </li>
     </ul>
   </li>
   <li>item-3
      <ul>
         <li>item-3.1</li>
      </ul>
   </li>
   <li>item-4</li>
   <li>item-5</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

最终单李如下

<ul>
   <li>item-1</li>
   <li>item-2</li>
   <li>item-3</li>
   <li>item-4</li>
   <li>item-5</li>
   <li>item-1.1</li>
   <li>item-2.1</li>
   <li>item-2.2</li>
   <li>item-3.1</li>
   <li>item-2.2.1</li>
   <li>item-2.2.2</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

基本上遍历每个级别然后追加到列表的末尾.我有什么想法可以达到这个目的吗?所以它可以处理任何级别的列表项.

提前致谢.

Fré*_*idi 5

这是一个递归方法,它将为您提供所需的输出:

function recurseFetchListItems($ul)
{
    var $li = $ul.remove().children("li").remove();
    if ($li.length) {
        $li = $li.add(recurseFetchListItems($li.children("ul")));
    }
    return $li;
}
Run Code Online (Sandbox Code Playgroud)

它使用add()来累积不同级别的列表项,同时从文档中删除每个级别.它还使用children()而不是find()来处理每个调用的单个深度级别.

从那里,您只需要从第一个<ul>元素开始,将累积的列表项集添加回文档,并将它们包装在一个新<ul>元素中:

$(document).ready(function() {
    recurseFetchListItems($("ul:first")).appendTo("body").wrapAll("<ul>");
});
Run Code Online (Sandbox Code Playgroud)

你可以在这个小提琴中看到结果.



原始(误入歧途)的答案如下:

你不需要一个递归函数来做到这一点,因为整个DOM元素树可以与一个选择器匹配.例如,$("li")匹配所有列表项,无论其深度如何.

因此,为了实现您想要的,我们只需要匹配所有<li>元素,<ul>从文档中删除它们的父元素,然后<ul>使用wrapAll()将列表项包装到新元素中并添加该元素:

$(document).ready(function() {
    $("li").parent().remove().end().appendTo("body").wrapAll("<ul>");
});
Run Code Online (Sandbox Code Playgroud)

你可以在这个小提琴中看到结果.