[英]How to iterate over deep nested hash without known depth in Ruby
[英]How to iterate over a hash that contains deep nested array using helper method in rails
我有一个带有深层嵌套数组的哈希。 我需要对其进行迭代并找到例如56H
的值,并提取其相关的人类可读名称Manager
。 在Rails中使用辅助方法,该怎么办? 这是哈希表:
HASH_TABLE = {
'Users' => [['Manger','56H'],
['Admin', '56A'],
['Policy', '56B'],
['Member','78C'],
['Guest','764']],
'Visitor' => [['Worker','55H'],
['Employee','55A'],
['Guest','55B'],
['Temp Member','78C'],
['NA','764AA']]
}
谢谢你的帮助!
在不了解结构或上下文的情况下,我最好的答案是遍历哈希中的每个元素,然后遍历哈希值中的每个数组。 我不确定这里的“人类可读名称”是什么意思,因为哈希键和第一个数组元素都是人类可读名称。 我假设您的意思是下面的代码中的哈希键,但这可能是不正确的。
def human_readable_name(str)
HASH_TABLE.each do |key, array|
array.each do |entry|
return entry[0] if entry[1] == str
end
end
nil
end
如果您要查找多个地址,则可以执行以下操作:
HASH_TABLE.each_with_object({}) { |(_,v),h|
v.each { |type, value| h[value] = type } }
#=> {"56H"=>"Manager", "56A"=>"Admin", "56B"=>"Policy",
# "78C"=>"Temp Member", "764"=>"Guest", "55H"=>"Worker",
# "55A"=>"Employee", "55B"=>"Guest", "764AA"=>"NA"}
h["56H"] #=> "Manager"
h["55B"] #=> "Guest"
构造哈希的其他两种方法:
h = Hash[HASH_TABLE.values.flatten(1).map(&:reverse)]
和
h = Hash[HASH_TABLE.values.flatten(1)].invert
如果HASH_TABLE['Users']
和HASH_TABLE['Visitor']
中都HASH_TABLE['Users']
相同的“键”(例如"Employee"
),则可能更有用:
h = HASH_TABLE.each_with_object({}) { |(k,v),h|
v.each { |type, value| h[value] = [k, type] } }
# => {"56H" =>["Users", "Manager"], "56A"=>["Users", "Admin"],
# "56B" =>["Users", "Policy"], "78C"=>["Visitor", "Temp Member"],
# "764" =>["Users", "Guest"], "55H"=>["Visitor", "Worker"],
# "55A" =>["Visitor", "Employee"], "55B"=>["Visitor", "Guest"],
# "764AA"=>["Visitor", "NA"]}
h["56H"] #=> ["Users", "Manager"]
h["55B"] #=> ["Visitor", "Guest"]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.