【问题标题】:Need help walking through nested hashes需要帮助遍历嵌套哈希
【发布时间】:2012-08-09 16:43:56
【问题描述】:

请原谅我的无知,我是 Ruby 新手,但不是编程。我正在使用一个名为 Ancestry 的 gem 在我的应用程序中存储分层数据。他们有一个名为“descendants”的方法,它返回一个节点中所有下降的子节点、孙子节点等的嵌套哈希,但我很难尝试遍历每个节点并输出所有子节点。

这是数据结构的样子

{
  #<Forum id: 16, name: "Parent 1", ancestry: "7", display_order: 1> =>{}, 
  #<Forum id: 17, name: "Parent 2", ancestry: "7", display_order: 2> =>{}, 
  #<Forum id: 13, name: "Parent 3", ancestry: "7", display_order: 3> =>
  {
    #<Forum id: 14, name: "Child 1", ancestry: "7/13", display_order: 1> =>{}, 
    #<Forum id: 15, name: "Child 2", ancestry: "7/13", display_order: 2> =>
    {
      #<Forum id: 18, name: "Grand Child", ancestry: "7/13/15", display_order: 1> =>{}, 
    }
  }
}

当我使用下面的代码遍历该数据时,父节点是唯一最终呈现到屏幕上的节点。

<% forum.descendants.arrange(:order => :display_order).map do |forum,key| %>
  <%= render :partial => 'forum', :locals => {:forum => forum} %>
<% end %>

如何也渲染子节点?我知道它们可以通过“key”变量访问,但我不知道如何判断“key”变量何时具有我可以呈现的数据以及如何输出该数据。有什么建议吗?

【问题讨论】:

    标签: ruby-on-rails ruby ancestry


    【解决方案1】:

    您可以通过key.is_a?(Hash) 来检查密钥是否为哈希。

    在您的示例中,它将始终评估为 true,因为 {} 是一个空哈希。您可以使用key.empty?检查哈希是否为空

    要遍历嵌套哈希,您可以像这样递归地执行它

    def display hash
        hash.each do |key, val|
            # print key etc
            if val.is_a?(Hash)
                display val
            else
                # print value or whatever operation you want
            end
        end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-21
      • 2014-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多