0
Restaurant = {:name=>"McDonalds",
 :location=>"NYC",
 :chefs=>
  [{:name=>"Sunny", :food=>"fries"},
   {:name=>"Brooklyn", :food=>"burgers"},
   {:name=>"Mac", :food=>"burgers"}],
 :waiters=>
  [{:name=>"Jess", :role=>"senior manager"},
   {:name=>"Sam", :role=>"manager"},
   {:name=>"Jack", :role=>"server"},
   {:name=>"Mary", :role=>"server"}]}

How would you print out all the values in the array above?

4
  • 6
    What have you tried so far? Seems like simple recursion. As a side note, why not use classes or structs instead? Commented Jul 26, 2013 at 12:25
  • 2
    what kind of output are you expecting? do you want to preserve the nested structure? Commented Jul 26, 2013 at 12:34
  • Sorry what I mean is how would I print out all the values in the entire hash, so output is McDonalds, NYC, Sunny, fries, Brooklyn, burgers....etc Commented Jul 26, 2013 at 12:37
  • use puts. the ruby line would be puts mc_d if you've assigned your hash to the variable mc_d. Commented Jul 26, 2013 at 12:52

3 Answers 3

1
Restaurant = {:name=>"McDonalds",
 :location=>"NYC",
 :chefs=>
  [{:name=>"Sunny", :food=>"fries"},
   {:name=>"Brooklyn", :food=>"burgers"},
   {:name=>"Mac", :food=>"burgers"}],
 :waiters=>
  [{:name=>"Jess", :role=>"senior manager"},
   {:name=>"Sam", :role=>"manager"},
   {:name=>"Jack", :role=>"server"},
   {:name=>"Mary", :role=>"server"}]}

keys = Restaurant.map{|k,v| k if v.is_a? Array}.compact

keys.each{|i| Restaurant[i].each{|h| p h.keys,h.values}}

Output:

[:name, :food]
["Sunny", "fries"]
[:name, :food]
["Brooklyn", "burgers"]
[:name, :food]
["Mac", "burgers"]
[:name, :role]
["Jess", "senior manager"]
[:name, :role]
["Sam", "manager"]
[:name, :role]
["Jack", "server"]
[:name, :role]
["Mary", "server"]

keys.each{|i| Restaurant[i].each{|h| p h.to_a.flatten}}

Output:

[:name, "Sunny", :food, "fries"]
[:name, "Brooklyn", :food, "burgers"]
[:name, "Mac", :food, "burgers"]
[:name, "Jess", :role, "senior manager"]
[:name, "Sam", :role, "manager"]
[:name, "Jack", :role, "server"]
[:name, "Mary", :role, "server"]

keys.each{|i| Restaurant[i].each{|h| p h.to_a}}

Output

[[:name, "Sunny"], [:food, "fries"]]
[[:name, "Brooklyn"], [:food, "burgers"]]
[[:name, "Mac"], [:food, "burgers"]]
[[:name, "Jess"], [:role, "senior manager"]]
[[:name, "Sam"], [:role, "manager"]]
[[:name, "Jack"], [:role, "server"]]
[[:name, "Mary"], [:role, "server"]]

Update

require 'pp'

hsh = {:name=>"McDonalds",
 :location=>"NYC",
 :chefs=>
  [{:name=>"Sunny", :food=>"fries"},
   {:name=>"Brooklyn", :food=>"burgers"},
   {:name=>"Mac", :food=>"burgers"}],
 :waiters=>
  [{:name=>"Jess", :role=>"senior manager"},
   {:name=>"Sam", :role=>"manager"},
   {:name=>"Jack", :role=>"server"},
   {:name=>"Mary", :role=>"server"}]}

pp hsh.flat_map{|k,v| v.is_a?(Array) ? (v.flat_map(&:values)) : v }

Output

["McDonalds",
 "NYC",
 "Sunny",
 "fries",
 "Brooklyn",
 "burgers",
 "Mac",
 "burgers",
 "Jess",
 "senior manager",
 "Sam",
 "manager",
 "Jack",
 "server",
 "Mary",
 "server"]

puts hsh.flat_map{|k,v| v.is_a?(Array) ? (v.flat_map(&:values)) : v }.join(",")

# => McDonalds,NYC,Sunny,fries,Brooklyn,burgers,Mac,burgers,Jess,senior manager,Sam,manager,Jack,server,Mary,server
Sign up to request clarification or add additional context in comments.

Comments

0
puts(
  Restaurant
  .values.flatten.flat_map{|v| v.kind_of?(Hash) ? v.values : v}
  .join(", ")
)

# => McDonalds, NYC, Sunny, fries, Brooklyn, burgers, Mac, burgers, Jess, senior manager, Sam, manager, Jack, server, Mary, server

Comments

0

Here's an example for somewhat formatted output. As others have asked, there's a big question about what kind of output you would like.

Restaurant = {:name=>"McDonalds",
 :location=>"NYC",
 :chefs=>
  [{:name=>"Sunny", :food=>"fries"},
   {:name=>"Brooklyn", :food=>"burgers"},
   {:name=>"Mac", :food=>"burgers"}],
 :waiters=>
  [{:name=>"Jess", :role=>"senior manager"},
   {:name=>"Sam", :role=>"manager"},
   {:name=>"Jack", :role=>"server"},
   {:name=>"Mary", :role=>"server"}]}

def print_restaurant( res, level = 0, indent = 3 )
  res.each do |rk, rv|
    if rv.is_a? Array then
      puts "\n" + (" " * indent * level) + "#{rk.to_s}:"
      rv.each { |cv| print_restaurant(cv, level + 1) }
    else
      puts (" " * indent * level) + "#{rk.to_s}: #{rv}"
    end
  end
end

print_restaurant( Restaurant )

name: McDonalds
location: NYC

chefs:
   name: Sunny
   food: fries
   name: Brooklyn
   food: burgers
   name: Mac
   food: burgers

waiters:
   name: Jess
   role: senior manager
   name: Sam
   role: manager
   name: Jack
   role: server
   name: Mary
   role: server

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.