Reverse a hash in Ruby

35,814

Solution 1

You could convert the Hash to an Array, reverse that, and then convert it back to a Hash:

reversed_h = Hash[h.to_a.reverse]

Hash#to_a gives you an array of arrays, the inner arrays are simple [key,value] pairs, then you reverse that array using Array#reverse, and Hash[] converts the [key,value] pairs back into a Hash.

Ruby 2.1 adds an Array#to_h method so you can now say:

reversed_h = h.to_a.reverse.to_h

Solution 2

In Ruby 2.1+ you can combine reverse_each and to_h:

{foo: 1, bar: 2}.reverse_each.to_h
#=> {:bar=>2, :foo=>1}

Solution 3

hash = { "4" => "happiness", "10" => "cool", "lala" => "54", "1" => "spider" }
reversed_hash = Hash[hash.to_a.reverse]

Solution 4

h = { "4" => "happiness", "10" => "cool", "lala" => "54", "1" => "spider" }
p Hash[h.reverse_each.map{|e| e}]
#=> {"1"=>"spider", "lala"=>"54", "10"=>"cool", "4"=>"happiness"}

But this leaves a bad taste (just like the other answers, which work fine just like this one). If you have to do this, it could be an indication that a Hash was not the best choice.

Solution 5

In pure ruby, you can do it by hash.map(&:reverse).to_h or hash.reverse_each.to_h

In rails, you can do it by hash.invert

Share:
35,814
slyv
Author by

slyv

Just a little programer.

Updated on July 09, 2022

Comments

  • slyv
    slyv almost 2 years

    How would I reverse the elements in the hash, keeping the same values and keys, but reversing their order in the hash.

    Like so:

    { "4" => "happiness", "10" => "cool", "lala" => "54", "1" => "spider" }
    

    And convert that to:

    { "1" => "spider", "lala" => "54", "10" => "cool", "4" => "happiness" }
    

    Or, perhaps I could run a each loop backwards, starting from the last element in the hash, rather than the first?