如果我有一個像下面這樣的散列,我想循環第二級鍵。如何循環內部哈希?
爲什麼這會失敗?
hash["Element"].each do |id|
h[id] = hash[id]["Name"]
end
散列
{
"Element" => {
"499723" => {
"Name" => "A",
},
"499725" => {
"Name" => "B",
},
}
如果我有一個像下面這樣的散列,我想循環第二級鍵。如何循環內部哈希?
爲什麼這會失敗?
hash["Element"].each do |id|
h[id] = hash[id]["Name"]
end
散列
{
"Element" => {
"499723" => {
"Name" => "A",
},
"499725" => {
"Name" => "B",
},
}
這是因爲在使用散列失敗.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"}
什麼時候我想用最後一個例子與第二個例子相比,這需要更少的輸入? –
在你原來的例子中,你使用了一個累加器'h'來存儲返回的值。你沒有把它包含在你的問題中。我提出的最後一個版本不需要額外的變量作爲累加器。 「打字」的數量並不總是衡量良好的代碼。 –
非常好!謝謝。 –
hash["Element"].each.with_object({}) do |(id, subhash), result|
result[id] = subhash["Name"]
end
你對你的問題越來越下降票,因爲這可能已經通過閱讀[文件](HTTP想通了://紅寶石文檔。 org/core-2.3.1/Hash.html#method-i-each)爲Hash的'each'。 「[Stack Overflow用戶需要多少研究工作?](http://meta.stackoverflow.com/q/261592/128421)」將有助於解釋原因。 –