2013-08-31 114 views
0

我想訪問嵌套散列中的元素,其中鍵是相似的符號。紅寶石嵌套散列中的訪問元素

favs = { 
    :art => "painters", 
    :survey1 => [ 
    {:name => "Josh", :painter => "Dali" }, 
    {:name => "Mona", :painter => "Monet"} 
    ], 
    :survey2 => [ 
    {:name => "Leon", :answer => "None"}, 
    {:name => "Port", :answer => "Picasso"}, 
    ] 
} 

Q1:刪除Leon-

我想出了這一點:

favs[:survey2].each { |hash| 
hash.delete_if { |k,v| 
v=="Leon" 
} 
} 

,但我無法弄清楚如何配合第二鍵值對的(接聽/畫家)刪除後只是名稱。

Q2返回喬希最喜歡的畫家 - 同樣的問題,我可以找到:姓名=>喬希但不知道如何返回相應的畫家。

在此先感謝

+1

通過一個問題我的答案是,你爲什麼要使用嵌套哈希?相反,創建一個對象,原語就是這樣,原始的。 – iain

+0

[在紅寶石中嵌套哈希的元素的可能的重複](http://stackoverflow.com/questions/5544858/accessing-elements-of-nested-hashes-in-ruby) – anon

回答

1

A1:

您必須刪除數組中的哈希值,而不是哈希中的元素。

favs[:survey2].delete_if {|i| i[:name] == "Leon"} 

A2:

favs[:survey1].find { |i| i[:name] == "Josh" }[:painter] 
1

就像我在評論中提到,不要當他們成爲過,呃,原始使用原始的。嵌套anythings是你在這個階段的提示:

class Student 
    attr_reader :name 
    attr_reader :favourite_painter 

    def initialize(name, opts={}) 
    @name = name 
    @favourite_painter = opts[:favourite_painter] 
    end 
end 

students = [] 
students << Student.new("Josh", :favourite_painter => "Dali") 
students << Student.new("Mona", :favourite_painter => "Monet") 
# etc… 

而看到http://www.ruby-doc.org/core-2.0/Array.htmlhttp://www.ruby-doc.org/core-2.0/Enumerable.html

+0

這是一個練習,這些都是問題我需要解決。我沒有編寫散列本身。 在你的答案中,我不確定學生是指什麼。 – icecreamsoda

+0

你發佈的內容似乎是學生(或人)和他們最喜歡的畫家列表。喬希是一名學生,他最喜歡的畫家是達利。學生是一個爲保存數據而創建的類,正如我之前所說的那樣,將數據放入嵌套哈希中會讓您自己難過。我不確定練習的目的是什麼,是通過一個你可能不會遇到的結構學習緩衝,因爲你不會創建一個這樣的結構,還是要學習Ruby?這就是爲什麼Ruby不像Perl那樣使用類來烘焙類的原因,這樣做更容易。 – iain