简体   繁体   中英

Ruby array of arrays into array of hashes

I have an array of arrays:

data = [
 ["Smith", "Bob", "Male"], 
 ["Jim", "Tim", "Male"],   
 ["Welch", "Anne", "Female"]
]

How would I convert it to look like:

data = [
 {:first_name => "Smith", :last_name => "Bob", :gender => "Male"},  
 {:first_name => "Jim", :last_name => "Tim", :gender => "Male"}, 
 {:first_name => "Welch", :last_name => "Anne", :gender => "Female"}
]

You can do something like this:

fields = [:first_name, :last_name, :gender]
data.map {|row| fields.zip(row).to_h }

#=> [{:first_name=>"Smith", :last_name=>"Bob", :gender=>"Male"}, {:first_name=>"Jim", :last_name=>"Tim", :gender=>"Male"}, {:first_name=>"Welch", :last_name=>"Anne", :gender=>"Female"}] 

Keep in mind that this will only work if the elements are in the same order as the fields.

Also you could use Struct :

presenter = Struct.new(:first_name, :last_name, :gender)
data.map { |e| presenter.new(*e).to_h }
#=> [{:first_name=>"Smith", :last_name=>"Bob", :gender=>"Male"}, 
#    {:first_name=>"Jim", :last_name=>"Tim", :gender=>"Male"}, 
#    {:first_name=>"Welch", :last_name=>"Anne", :gender=>"Female"}]
fields = [:first_name, :last_name, :gender]
data.map{|d| Hash[fields.zip(d)]}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM