![](/img/trans.png)
[英]How to iterate over deep nested hash without known depth in Ruby
[英]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.