给出哈希 -
hash = {
1 => {"ID" => ["NUMBER", 11] },
2 => {"TITLE" => ["VARCHAR2", 5] },
3 => {"FIRST_NAME" => ["VARCHAR2", 50] },
4 => {"LAST_NAME" => ["VARCHAR2", 50] },
5 => {"BIRTH_DATE" => ["DATE", -2] }
}
和2个输入参数 - "FIRST_NAME"
和["VARCHAR2",50]
。
最优雅的方式是什么 -
"FIRST_NAME"
是否作为任何嵌套哈希的键存在。 hash[3]["FIRST_NAME"]
的值是否等于第二个参数,即["VARCHAR2",50]
。 目前我执行以下操作 -
array = hash.values.map {|h| h.to_a}.flatten(2)
puts hash.key(Hash["FIRST_NAME",["VARCHAR2",50]]) if !(index = array.index("FIRST_NAME")).nil? ? array[index+1] == ["VARCHAR2",50] : false # 3
答案 0 :(得分:1)
似乎你的行为会破坏哈希的目的/性能。
您应该使用(我假设的)唯一名称“ID”,“TITLE”,“FIRST_NAME”...作为您的顶级键;数字1-5似乎未使用。
按键搜索哈希映射很快,必须将所有值映射到数组中,而不是对数组进行线性搜索的速度很慢。
答案 1 :(得分:1)
您可以在hash api
找到很多信息。
a = 'FIRST_NAME'
b = ['VARCHAR2', 50]
hash.each do |k, v|
if v.key?(a) # ①
return k if v[a] == b # ② and ③
end
end
你也可以把它写成下面的实际值,因为如果它不包含键,它将永远不会匹配,只是转到下一次出现。
hash.each do |k, v|
return k if v[a] == b
end
如果您需要在each
上执行新的v
,则您的示例仅显示一对哈希值。
答案 2 :(得分:1)
有一种方法key
可以做到这一点:
hash.key({"FIRST_NAME" => ["VARCHAR2",50]}) # => 3