检查给定字符串是否作为嵌套哈希中的键存在

时间:2012-10-23 12:12:24

标签: ruby arrays hash

给出哈希 -

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]

最优雅的方式是什么 -

  1. 检查"FIRST_NAME"是否作为任何嵌套哈希的键存在。
  2. 如果存在,hash[3]["FIRST_NAME"]的值是否等于第二个参数,即["VARCHAR2",50]
  3. 如果这两个参数匹配,则返回其值为此嵌套哈希的键,在本例中为3
  4. 目前我执行以下操作 -

    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
    

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