How to merge two arrays of hashes

arrays, ruby, ruby-hash

Solution

`uniq` would work if you concatenate the arrays in reverse order:

(b + a).uniq { |h| h[:key] }
#=> [
#     {:key=>1, :value=>"bar"},
#     {:key=>1000, :value=>"something"},
#     {:key=>2, :value=>"baz"}
#   ]

It doesn't however preserve the order.

Problem

I have two arrays of hashes: ``` a = [ { key: 1, value: "foo" }, { key: 2, value: "baz" } ] b = [ { key: 1, value: "bar" }, { key: 1000, value: "something" } ] ``` I want to merge them into one array of hashes, so essentially `a + b` except I want any duplicated key in `b` to overwrite those in `a`. In this case, both `a` and `b` contain a key `1` and I want the final result to have `b`'s key value pair. Here's the expected result: ``` expected = [ { key: 1, value: "bar" }, { key: 2, value: "baz" }, { key: 1000, value: "something" } ] ``` I got it to work but I was wondering if there's a less wordy way of doing this: ``` hash_result = {} a.each do |item| hash_result[item[:key]] = item[:value] end b.each do |item| hash_result[item[:key]] = item[:value] end result = [] hash_result.each do |k,v| result << {:key => k, :value => v} end puts result puts expected == result # prints true ```

Original source