2015-12-16 25 views
1

我有一个哈希看起来是这样的:选择从嵌套的哈希值与未知键

hash = { "data" => { 
    "Aatrox" => { 
     "id" => "Aatrox", 
     "key" => "266", 
     "name" => "Aatrox" 
     }, 
    "Ahri" => { 
     "id" => "Ahri", 
     "key" => "123", 
     "name" => "Ahri" 
     }, 
    "Another name" => { 
     "id" => "Another name", 
     "key" => "12", 
     "name" => "Another name" 
     }, 
    } 
} 

我试图从给定键匹配“ID”获得的价值:

def get_champion_name_from_id(key) 
    filtered = @champion_data["data"].select do | key, champ_data | 
     Integer(champ_data["key"]) == key 
    end  
end 

我使用的选择得到匹配块的项目,然而,返回值是另一个哈希,看起来像这样:

{ 
    "Aatrox": { 
     "id" => "Aatrox", 
     "key" => "266", 
     "name" => "Aatrox" 
    } 
} 

我怎样才能避免这种情况,并得到最后一个嵌套散列? 如果传递的关键是266,我想这个哈希:

{ 
    "id" => "Aatrox", 
    "key" => "266", 
    "name" => "Aatrox" 
} 

这哈希值是一个解析的JSON文件的结果,所以没有办法,我可以做filtered["Aatrox"]得到一个给定值。

回答

4

Hash#values仅返回值(无键)。通过使用Enumerable#find,您将获得第一个匹配的项目,而不是包含单个项目的数组。

@champion_data['data'].values.find { |champ_data| 
    champ_data['key'] == '266' 
} 
# => {"id"=>"Aatrox", "key"=>"266", "name"=>"Aatrox"} 

def get_champion_name_from_id(key) 
    key = key.to_s 
    @champion_data['data'].values.find { |champ_data| 
    champ_data['key'] == key 
    } 
end 
+0

这是伟大的,比我试图干净多了,非常感谢! –

0

您可以用select方法也做到这一点:

@champion_data["data"].select do |key, val| 
    @champion_data["data"][key] if @champion_data["data"][key]["key"] == "266" 
end 
+0

这返回相同的结果,另一个嵌套散列,这不是我正在寻找 –