递归函数遍历第n个嵌套深度

时间:2020-03-31 20:34:41

标签: ruby-on-rails ruby recursion

我正在使用的数据:

(我有XML格式的文件)

<root>

    <!-- level 1 nesting -->
    <main name="A" category="group">
        <sub name="A.1"></sub>
    </main>

    <!-- level 1 nesting -->
    <main name="B" category="group">
        <sub name="B.1"></sub>
    </main>

    <!-- level 1 nesting -->
    <main name="C" category="group">
        <sub name="C.1"></sub>
    </main>

    <!-- level 1 nesting -->
    <main name="D" category="group">
        <sub name="D.1"></sub>
    </main>

    <!-- level 2 nesting -->
    <main name="E" category="group">
        <sub name="E.1" category="group">
            <sub name="E.1.1"></sub>
        </sub>
    </main>

    <!-- level n nesting - this is what I need help with -->
    <main name="E" category="group">
        [...]
    </main>

</root>

所需结果

  • 我想根据上面显示的关系在UL和LI中将以上内容打印出来,以生成树状视图。
  • 我正在使用的数据的嵌套深度不同(例如,可能是单个项目,也可能是100个嵌套深度-我们不知道)
  • 我需要编写一个可以在功能上满足任何嵌套深度级别的解决方案
  • 属性值为main的标签(subcategory)都表示它有孩子
  • 第一级标签始终为"group",其余的标签均为main,无论嵌套深度如何

我目前正在尝试什么

sub

我的解决方案问题

在调用自身之后,当前迭代终止(如预期的那样)并更深一层。但是,由于我不再知道它们从哪里开始,所以现在无法关闭 def recursiveLoop(group) str = "" group.each { |g| str += "<ul>" str += "<li>#{g.attribute("name")}" if g.attribute("category").to_s == "group" recursiveLoop(g.css("sub")) else str += "</li></ul>" end } return str end <li>标签。

为CamiloVA编辑 Pic

2 个答案:

答案 0 :(得分:2)

这有效

def recursiveLoop(group)
    str = ""
    group.each { |g|

        str +=  "<li>#{g.attribute("name")}"

        if g.attribute("category").to_s == "group"
            str += "<ul>"
            str += recursiveLoop(g.css("> sub"))
            str += "</ul>"
        end
        str += "</li>"
    }
    return str
end

不过有两件事:

  1. 在标记中的<ul>的结果周围有一个主要的</ul>recursiveLoop标签。像这样:
<%= sanitize "<ul>" + recursiveLoop(@groups) + "</ul>" %>

这只是提供一个根节点而不会缠结在其他对象上。

  1. 请确保在XML变量> sub的css选择器中指定g(忘了我使用Nokogiri)以将所有子项限制为它们的立即父母。

答案 1 :(得分:1)

正如@simplelime所说,您可以将close tag放在if block之后,并将函数的返回值连接到相同的初始str,这样您将获得所有每个主节点内的递归子代;在执行结束时,它将返回大的结果字符串。

def recursiveLoop(group)
    str = ""
    group.each { |g|

        str +=  "<ul>"
        str +=  "<li>#{g.attribute("name")}"

        if g.attribute("category").to_s == "group"
            str += recursiveLoop(g.css("sub"))
        end
        str += "</li></ul>"
    }
    return str
end