如何访问哈希

问题描述:

我有这个工作与复杂的阵列:如何访问哈希

[ 
    ["app1", {"name"=>"name1", "path"=>"xyz.com/"}], 
    ["app2", {"name"=>"name2", "path"=>"xyz.com/"}], 
    ["app3", {"name"=>"name3", "path"=>"xyz.com/"}], 
    # etc. 
] 

我希望能够访问每个名称和路径,所以我尝试:

apps.each do |key, value| 
    value.each do |key, value| 
    puts value 
    end 
end 

但这返回枚举。任何想法我怎么能做到这一点?

+0

考虑为这种事情创建自己的'类' - 更具可读性。 – Reactormonk 2012-03-22 15:35:36

apps = [["app1", {"name"=>"name1", "path"=>"https://xyz.com/"}], ["app2", {"name"=>"name2", "path"=>"https:/xyz.com/"}], ["app3", {"name"=>"name3", "path"=>"https://xyz.com/"}]] 
apps.flatten.each do |t| 
    next unless t.class == Hash 
    next unless t.key?("name") 
    next unless t.key?("path") 
    puts t.inspect # now t is a hash that has both "name" and "path" keys - do what you want 
end 

当你有不同的元素不同的结构本可以处理得有些更复杂的情况。

+0

正是我所需要的,谢谢。 – Josh 2012-03-22 15:42:52

+0

这就是我最终做的 - 'apps = apps.flatten apps = apps.delete_if do | key,value | key.class ==字符串结尾 apps.each do | app |放弃结束' – Josh 2012-03-22 15:55:28

我想你的第一个每个循环只遍历数组,所以这将是:

apps.each do |app| 
    app.each do |key, value| 
    puts key # would be app1 in the first array 
    puts value["name"] 
    puts value["path"] 
    end 
end 

ar = [ 
    ["app1", {"name"=>"name1", "path"=>"xyz.com/"}], 
    ["app2", {"name"=>"name2", "path"=>"xyz.com/"}], 
    ["app3", {"name"=>"name3", "path"=>"xyz.com/"}] 

] 
#Get a specific app: 
p ar.assoc("app2").last["name"] 
#Get all names and paths 
ar.each{|app| name, path = app.last["name"], app.last["path"]}