Home > Software engineering >  Convert array of hashes to single hash with values as keys
Convert array of hashes to single hash with values as keys

Time:04-01

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}

CodePudding user response:

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}

CodePudding user response:

One more possible solution is:

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

CodePudding user response:

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.

  •  Tags:  
  • ruby
  • Related