如何循环哈希?

时间:2016-08-06 12:02:06

标签: ruby hash

如果我有一个类似下面的哈希,我想循环第二级密钥。

为什么这会失败?

hash["Element"].each do |id|
  h[id] = hash[id]["Name"]
end

散列

{
    "Element" => {
        "499723" => {
                      "Name" => "A",
         },
        "499725" => {
                      "Name" => "B",
     },
}

2 个答案:

答案 0 :(得分:2)

失败是因为在哈希上使用.each会产生键和值的元组。

hash = {
  "Element" => {
    "499723" => {
      "Name" => "A",
     },
    "499725" => {
      "Name" => "B",
     },
  }
}

hash["Element"].each do |id|
  p id
end

["499723", {"Name"=>"A"}]
["499725", {"Name"=>"B"}]

因此,您需要使用

hash["Element"].each do |id, value|
  # ...
end

如果您不需要值

hash["Element"].each do |id, _|
  # ...
end

但是,您可以保留该值并直接访问它

hash["Element"].each do |id, value|
  h[id] = value["Name"]
end

在您的情况下,一个简单的解决方案是将Enumberable#each_with_object与之前的信息结合使用:

hash["Element"].each_with_object({}) do |(id, value), acc|
  acc[id] = value["Name"]
end

# => {"499723"=>"A", "499725"=>"B"}

答案 1 :(得分:1)

hash["Element"].each.with_object({}) do |(id, subhash), result|
  result[id] = subhash["Name"]
end