2012-03-22 4 views
0

у меня есть это работать с:Как получить доступ к сложной массив хэшей

[ 
    ["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 

но это возвращает Enumerator. Любая идея, как я могу это сделать?

+0

Рассмотрите возможность создания собственного «класса» для такого рода предметов - более читаемого. – Reactormonk

ответ

1
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

+0

Это то, что я закончил делать: 'apps = apps.flatten apps = apps.delete_if сделать | ключ, значение | key.class == String end apps.each do | app | puts blah end ' – Josh

0

Я думаю, что ваш первый каждый цикл только цикл над массивом, так что было бы:

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 
0
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"]} 
Смежные вопросы