Custom order of Hash

Would a custom order of a hash be useful in Rails?

If I have the following Hash:

my_hash = { key1: ‘value’, key2: ‘value’, key3: ‘value’ }

And I want to order it by the following keys:

my_hash = my_hash.order(:key2, :key1, :key3)

I would get a new hash with the following result:

puts my_hash

=> { key2: ‘value’, key1: ‘value’, key3: ‘value’ }

Using the following code:

class Hash

def order(*keys)

Hash[keys.collect {|k| self[k] ? [k, self[k]] : nil }.compact]

end

end

Any thoughts?

Having an OrderedHash that saves insertion order is useful enough and I personally don’t see a reason for a custom ordered hash. Wouldn’t it be less expensive to order only the keys in a separate array and access the hash rather than creating a new hash?

My 2 cents.

Hashes are by definition unordered. If you think you need an ordered hash, then you probably don't understand hashes...

Hashes are by definition unordered. If you think you need an ordered hash, then you probably don’t understand hashes…

Ruby 1.9 onwards saves the insertion order of hashes. In fact in Ruby 2.1 - a hash of under 6 elements is stored as an array :wink:

2.1.0 :001 > hsh = {‘a’ => 1, ‘b’ => 2, ‘c’ => 3}

=> {“a”=>1, “b”=>2, “c”=>3}

1.8.7-p374 :001 > hsh = {‘a’ => 1, ‘b’ => 2, ‘c’ => 3}

=> {“c”=>3, “b”=>2, “a”=>1}

There is a reason why we have ordered hashes…

Honestly, I’ve needed it many times and was surprised that it wasn’t implemented yet. Of course, there are a few ways you can do this (probably more efficient way than what I suggested) but we also need to keep in mind that we should keep our code as DRY as possible.