Mark Ortega
Mark Ortega

Reputation: 51

Merge two arrays that both have key value pairs (Ruby)

I am wondering how to merge these two arrays into one clean array in Ruby
Both arrays share one similar key:value pair. I am trying to merge information from these two separate arrays that have information for the same person. One array has his name. The other array has his job and age. Both arrays have an id matching to the same person.
An example of what I am trying to do

array1 = [ {:id => 1, :name => "Bob"}, {:id => 2, :name => "Tim"}]
array2 = [ {:id => 1, :job => "firefighter", :age => 25}, { :id => 2, :job => "accountant",      :age => 30} ]


new_array = [ {:id=> 1, name => "Bob", :job => "firefighter", :age => 25}, { :id => 2, :name => "Tim", :job => "accountant", :age => 30} ]

Upvotes: 1

Views: 2237

Answers (2)

Cary Swoveland
Cary Swoveland

Reputation: 110675

If the two arrays contain the same :id values at the same locations:

array1.zip(array2).map { |g,h| g.merge(h) }
  #=> [{:id=>1, :name=>"Bob", :job=>"firefighter", :age=>25},
  #    {:id=>2, :name=>"Tim", :job=>"accountant", :age=>30}]

or equivalently:

[array1, array2].transpose.map { |g,h| g.merge(h) }

If the two arrays contain the same :id values but not necessarily at the same locations:

(array1 + array2).group_by { |h| h[:id] }
                 .values
                 .map { |g,h| g.merge(h) }

or

array1.sort_by { |h| h[:id] }
      .zip(array2.sort_by { |h| h[:id] } )
      .map { |g,h| g.merge(h) } 

Upvotes: 1

August
August

Reputation: 12558

You could do something like this:

new_array = array1.each_with_index.map { |x, i| x.merge array2[i] }
# => [{:id=>1, :name=>"Bob", :job=>"firefighter", :age=>25}, {:id=>2, :name=>"Tim", :job=>"accountant", :age=>30}]

If you want a solution that is not dependent on the order of the array, and instead uses the :id to match the hashes:

array1.map { |x| x.merge (array2.find { |h| h[:id] == x[:id] } || {}) }

Upvotes: 3

Related Questions