Custom order of Hash

37 views
Skip to first unread message

Artem Kalinchuk

unread,
Feb 24, 2014, 10:28:59 AM2/24/14
to rubyonra...@googlegroups.com
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?

Gautam Rege

unread,
Feb 24, 2014, 11:30:38 AM2/24/14
to rubyonra...@googlegroups.com
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?

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-ta...@googlegroups.com.
To post to this group, send email to rubyonra...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/285cec00-c279-405b-982e-0710501bcb68%40googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Scott Ribe

unread,
Feb 24, 2014, 11:53:04 AM2/24/14
to rubyonra...@googlegroups.com
On Feb 24, 2014, at 8:28 AM, Artem Kalinchuk <art...@gmail.com> wrote:

> Any thoughts?

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

--
Scott Ribe
scott...@elevated-dev.com
http://www.elevated-dev.com/
(303) 722-0567 voice




Gautam Rege

unread,
Feb 24, 2014, 11:59:40 AM2/24/14
to rubyonra...@googlegroups.com

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 ;)

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} 

Artem Kalinchuk

unread,
Feb 24, 2014, 12:29:19 PM2/24/14
to rubyonra...@googlegroups.com
There is a reason why we have ordered hashes...

Artem Kalinchuk

unread,
Feb 24, 2014, 12:32:26 PM2/24/14
to rubyonra...@googlegroups.com
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.
Reply all
Reply to author
Forward
0 new messages