2014-11-04 93 views
0

我在紅寶石中有嵌套哈希值,我需要訪問它的特定值。我的哈希看起來像下面。在紅寶石中訪問哈希值散列值

hash = 

    {"list"=> 
     {"0"=> 
     {"date"=>"11/03/2014", 
     "item1"=>"", 
     "tiem2"=>"News", 
     "item3"=>"", 
     "item4"=>"", 
     "item5"=>"Videos", 
     "Type"=>"Clip"}, 
     "1"=> 
     {"date"=>"11/03/2014", 
     "item1"=>"", 
     "tiem2"=>"News", 
     "item3"=>"", 
     "item4"=>"", 
     "item5"=>"Videos", 
     "Type"=>"Program"} 
    }} 

我需要訪問每個鍵的「類型」的值。 我試着用下面的代碼,但我不知道爲什麼它沒有工作。

hash_type = hash["list"].keys.each {|key| puts key["Type"]} 

但它返回了密鑰列表。即0和1

請幫忙。

+0

由於您的鍵是字符串,這會工作:'h.to_s.scan(/(<=\"Type\"=> \」? )[^ \「] + /)=> [」剪輯「,」程序「](但我不會那樣做)。 – 2014-11-06 05:25:57

回答

3
hash["list"].map {|_, hash| hash['Type']} 

說明:

hash = {key: 'value'} 

您可以遍歷一個哈希使用each這樣的:

hash.each {|pair| puts pair.inspect } #=> [:key, 'value'] 

或類似這樣的

hash.each {|key, value| puts "#{key}: #{value}"} #=> key: value 

由於我們沒有使用關鍵在任何地方,某些地方e IDE會抱怨未使用的本地變量key。爲了防止出現這種情況,Ruby變體使用_作爲變量名稱,所有IDE都不會在意它未被使用。

+0

太棒了。雖然我不確定它是如何工作的以及地圖塊內發生了什麼,但我喜歡它。我在哪裏可以找到它的文檔/參考鏈接(| _,hash |),以便我能理解它。 – rubyist 2014-11-04 12:53:48

2
hash['list'].collect { |_, value| value['Type'] } 
=> ["Clip", "Program"] 
0

這是跟隨你的邏輯(一些答案張貼不同的方式來做到這一點)。爲什麼你去的東西錯了,如果我們走一步看一步的原因是:

hash_type = hash["list"].keys #=> ["0", "1"] 

所以一切後是一樣的,如:

["0", "1"].each {|key| puts key["Type"]} 

所以你基本上是在做放'1'['Type']'0'['Type']這都評估爲nil(在IRB中試用)。嘗試用p替換puts,然後您將打印2次爲零。你得到hash_type爲[「0」,「1」]的原因是因爲你的最後一個表達式是keys.eacheach總是返回「接收者」,也就是你稱之爲each的數組(正如我們前面看到的,該數組是[「0」,「1」])。

解決這個問題的關鍵是,按照你的特定邏輯,把「鍵」(在這個例子中是'0'和'1')放在適當的上下文中,並把它們放在上下文中看起來像這樣:

hash_type = hash["list"].keys.each {|key| puts hash["list"][key]["Type"]}` 

這將打印密鑰。但是,hash_type仍然是[「0」,「1」](請記住,each返回接收器的值)。如果你想存儲在hash_types實際類型的值,用map取代each和刪除puts

hash_type = hash["list"].keys.map {|key| hash["list"][key]["Type"]} #=> ["Clip", "Program"] 
+0

這仍然不會返回OP所需的內容('hash_type'包含密鑰列表) – 2014-11-04 12:51:37

+0

我更新了我的答案。 – daremkd 2014-11-04 12:56:13

+0

這也有效。我假定當你傳遞hash [「list」]。keys的每個鍵時,我們就可以像訪問常規散列那樣訪問鍵[「Type」]。 – rubyist 2014-11-04 12:59:31