我有一个散列,看起来像这样:
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
我使用select来获取与块匹配的项目,然而,返回值是另一个散列,看起来像这样:
{
"Aatrox": {
"id" => "Aatrox",
"key" => "266",
"name" => "Aatrox"
}
}
如何避免这种情况并只获取最后一个嵌套哈希?如果传递的密钥是266,我想得到这个散列:
{
"id" => "Aatrox",
"key" => "266",
"name" => "Aatrox"
}
这个散列是解析JSON文件的结果,所以我不可能通过filtered["Aatrox"]
来获得给定的值。
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
您也可以使用select
方法:
@champion_data["data"].select do |key, val|
@champion_data["data"][key] if @champion_data["data"][key]["key"] == "266"
end