2013-04-30 59 views
-1

我是一個初學者,正在尋找一種方法來遍歷包含散列值的散列。例如。我只想打印名爲「label」的鍵的內部哈希元素的所有值的列表。我的數組看起來像這樣:通過紅寶石散列哈希中的迭代

ary = Hash.new 
ary[:item_1] = Hash[ :label => "label_1" ] 
ary[:item_2] = Hash[ :label => "label_2" ] 
ary[:item_3] = Hash[ :label => "label_3" ] 

現在我想通過外散的所有元素進行迭代,並嘗試這樣的:

ary.keys.each { |item| puts ary[:item] } 

或本:

ary.keys.each { |item[:label]| puts ary[:item] } 

不幸的是既做不行。但是,如果我嘗試這一點 - 很瘋狂的感覺 - 彎路,我得到的結果,這是我想:

ary.keys.each { |item| 
    evalstr = "ary[:" + item.to_s + "][:label]" 
    puts eval(evalstr) 
} 

這樣產生的結果是:

label_1 
label_2 
label_3 

我絕對相信必須存在是一個更好的方法,但我不知道如何找到這種方法。

非常感謝您的提示!

+0

ary.keys.each {| item |放入ary [item] [:label]}就可以工作。但下面的ary.each_values答案是一個更清潔的解決方案。 – James 2013-04-30 08:05:33

回答

3

您可以使用each_value遍歷散列的所有值;或者,您可以使用each遍歷散列的所有鍵/值對,這將產生兩個變量,即鍵和值。

如果你要打印外散的每個散列值的單個值,你應該去這樣的事情:

ary.each_value { |x| puts x[:label] } 

下面是一個更復雜的例子,說明如何each作品:

ary.each { |key, value| puts "the value for :label for #{key} is #{value[:label]}" } 
0
ary = Hash.new 
ary[:item_1] = Hash[ :label => "label_1" ] 
ary[:item_2] = Hash[ :label => "label_2" ] 
ary[:item_3] = Hash[ :label => "label_3" ] 
ary.flat_map{|_,v| v.values} 
#=>["label_1", "label_2", "label_3"] 
0

See Hash methods

> ary = Hash.new 
> ary[:item_1] = Hash[ :label => "label_1" ] 
> ary[:item_2] = Hash[ :label => "label_2" ] 
> ary[:item_3] = Hash[ :label => "label_3" ] 

> ary.values.each {|v| puts v[:label]} 
    label_1 
    label_2 
    label_3 
+0

nice頭像shweta ji :)喜歡它 – 2013-04-30 09:11:31

+0

這工作也很好 - 非常感謝! – 2013-04-30 10:24:43