2013-04-30 75 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