2016-08-06 67 views
-4

如果我有一個像下面這樣的散列,我想循環第二級鍵。如何循環內部哈希?

爲什麼這會失敗?

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

散列

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

你對你的問題越來越下降票,因爲這可能已經通過閱讀[文件](HTTP想通了://紅寶石文檔。 org/core-2.3.1/Hash.html#method-i-each)爲Hash的'each'。 「[Stack Overflow用戶需要多少研究工作?](http://meta.stackoverflow.com/q/261592/128421)」將有助於解釋原因。 –

回答

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"} 
+0

什麼時候我想用最後一個例子與第二個例子相比,這需要更少的輸入? –

+1

在你原來的例子中,你使用了一個累加器'h'來存儲返回的值。你沒有把它包含在你的問題中。我提出的最後一個版本不需要額外的變量作爲累加器。 「打字」的數量並不總是衡量良好的代碼。 –

+0

非常好!謝謝。 –

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