从具有未知键的嵌套哈希中选择一个值



我有一个散列,看起来像这样:

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

最新更新