'Convert array of hashes to single hash with values as keys

Given a source array of hashes:

[{:country=>'england', :cost=>12.34}, {:country=>'scotland', :cost=>56.78}]

Is there a neat Ruby one-liner for converting it to a single hash, where the values for the :country key in the original hash (guaranteed to be unique) become keys in the new hash?

{:england=>12.34, :scotland=>56.78}


Solution 1:[1]

This should do what you want

countries.each_with_object({}) { |country, h| h[country[:country].to_sym] = country[:cost] }
 => {:england=>12.34, :scotland=>56.78}

Solution 2:[2]

You can do that using Enumerable#inject:

countries.inject({}) { |hsh, element| hsh.merge!(element[:country].to_sym => element[:cost]) }
 => {:england=>12.34, :scotland=>56.78}

We initialise the accumulator as {}, and then we iterate over each of the elements of the initial array and add the new formatted element to the accumulator.

One point to add is that using hsh.merge or hsh.merge! would have the same effect for the output, given that inject will set the accumulator hsh as the return value from the block. However, using merge! is better when it comes to memory usage, given that merge will always generate a new Hash, whereas merge! will apply the merge over the same existing Hash.

Solution 3:[3]

One more possible solution is:

countries.map(&:values).to_h
 => {"england"=>12.34, "scotland"=>56.78}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Ursus
Solution 2 Marcos Parreiras
Solution 3 Alex Holubenko