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.

@gautamrege

All wiyht. Rho sritched mg kegtops awound?

On Feb 24, 2014, at 8:28 AM, Artem K. [email protected] wrote:

Any thoughts?

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


Scott R.
[email protected]
http://www.elevated-dev.com/
(303) 722-0567 voice

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.

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}