繁体   English   中英

使用 Ruby on Rails 遍历深层嵌套的 hash

[英]Iterate through deep nested hash by using Ruby on Rails

我正在尝试遍历嵌套的 object 以检索由字符串标识的特定 object。 在下面的示例 object 中,标识符字符串是“label”属性。 我不知道如何遍历树以返回适当的 object。

我的 Ruby 和 Rails 版本都很旧。 Ruby - 1.9.3 导轨 - 3.0.9

`

company_tree = {
  label: 'Autos',
  subs: [
    {
      label: 'SUVs',
      subs: []
    },
    {
      label: 'Trucks',
      subs: [
        {
          label: '2 Wheel Drive',
          subs: []
        },
        {
          label: '4 Wheel Drive',
          subs: [
            {
              label: 'Ford',
              subs: []
            },
            {
              label: 'Chevrolet',
              subs: []
            }
          ]
        }
      ]
    },
    {
      label: 'Sedan',
      subs: []
    }
  ]
}

`

我尝试使用下面的代码。 但是我没有工作。 它只返回第二个数组。 它不会超过 go。

`

data = JSON.parse(requestData)

data['company_tree']['subs'].each do |element|
    puts "element=> #{element['subs']}"
end

`

假设您有问题中描述的company_tree变量,您可以使用递归遍历每个元素及其所有子元素。 这是我编写的代码,我将在下面进一步解释

def destruct_tree(element)
  puts "#{element[:label]} with subs #{element[:subs]}"
  element[:subs].each do |sub|
    destruct_tree sub
  end
end

destruct_tree company_tree

您为 function 提供了company_tree元素。 然后打印它的 label 和 subs。 然后它遍历所有 sub 并将它们再次传递给相同的 function。 这将实习打印他们的 label 和潜艇并再次运行他们所有的潜艇。

我希望这是有道理的

您可以像下面这样遍历 hash:

def iterate_through(company_tree)
  puts "#{company_tree[:label]} => #{company_tree[:subs]}"
  company_tree[:subs].each do |sub|
    iterate_through(sub)
  end
end

iterate_through(company_tree)


Output:

Autos => [{:label=>"SUVs", :subs=>[]}, {:label=>"Trucks", :subs=>[{:label=>"2 Wheel Drive", :subs=>[]}, {:label=>"4 Wheel Drive", :subs=>[{:label=>"Ford", :subs=>[]}, {:label=>"Chevrolet", :subs=>[]}]}]}, {:label=>"Sedan", :subs=>[]}]
SUVs => []
Trucks => [{:label=>"2 Wheel Drive", :subs=>[]}, {:label=>"4 Wheel Drive", :subs=>[{:label=>"Ford", :subs=>[]}, {:label=>"Chevrolet", :subs=>[]}]}]
2 Wheel Drive => []
4 Wheel Drive => [{:label=>"Ford", :subs=>[]}, {:label=>"Chevrolet", :subs=>[]}]
Ford => []
Chevrolet => []
Sedan => []

感谢支持,找到解决办法了

    def iterate(i)
        if i.is_a?(Hash)
            i.each do |k, v|
                if v.is_a?(Hash) || v.is_a?(Array)
                    iterate(v)
                else
                    puts("k is #{k}, value is #{v}")
                end
            end
        end
        if i.is_a?(Array)
            i.each do |v|
                iterate(v)
            end
        end
    end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM