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.