【问题标题】:Jquery recursive function combine nested li into oneJquery递归函数将嵌套的li合二为一
【发布时间】:2011-10-05 01:28:39
【问题描述】:

我正在尝试使用 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>

最后的单里如下

<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>

基本上循环遍历每个级别,然后附加到列表的末尾。 有什么想法可以实现这一目标吗?所以它可以处理任何级别的列表项。

感谢高级版。

【问题讨论】:

    标签: javascript jquery list recursion


    【解决方案1】:

    这是一种递归方法,可以提供您正在寻找的输出:

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

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

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

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

    你可以在this fiddle看到结果。



    原始(被误导的)答案如下:

    您实际上并不需要递归函数来执行此操作,因为整个 DOM 元素树可以与单个选择器匹配。例如,$("li") 匹配所有列表项,无论其深度如何。

    所以,要实现你想要的,我们只需要匹配所有&lt;li&gt; 元素,从文档中删除它们的父&lt;ul&gt; 元素,然后使用wrapAll() 将列表项包装成一个新的&lt;ul&gt; 元素并添加该元素:

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

    你可以在this fiddle看到结果。

    【讨论】:

    • 您好,感谢您的帮助。然而,这不是我想要的。我想要得到的结果列表是 1|2|3|4|5|1.1|1.2|...等。显示所有第一级项目,然后附加所有第二级项目。然后是第三个..
    • 我不确定这个顺序有多重要,但是这与示例代码中所需的输出顺序不匹配......很遗憾,因为这本来很好而且很干净!
    • @user843904,你完全正确,我误读了你的问题。我会尽快更新我的答案。
    • @Frédéric Hamidi,非常感谢您的帮助。这完美无缺。
    • @Frédéric Hamidi,嗨,回到这个问题,不确定您是否可以再次帮助我,我现在正在尝试为列表的每个级别和子级别添加一个 id 属性,即我现在想出的是 var id = 0;函数 createMenu($ul) { id ++; var $li = $ul.children("li").remove(); if ($li.length) { $li.first().attr('id', 'id-'+id); $li = $li.add(createMenu($li.children("ul").remove())); } 返回 $li;这只会给我每个级别的 id。不确定我的解释是否合理。感谢高级。
    猜你喜欢
    • 1970-01-01
    • 2011-02-22
    • 2010-12-18
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 2021-12-04
    相关资源
    最近更新 更多