Wednesday, 4 July 2012

Snippet: Array#to_hash

I've been finding this quite useful - especially when partition just isn't enough:

    def to_hash(&block)
      return {nil => self} unless block_given?
      the_hash = {}
      self.each do |val|
        key = block.call(val)
        the_hash[key] ||= []
        the_hash[key] << val
      end
      the_hash
    end

Usage examples:

   [1,2,3,4,5,6].to_hash {|v| v % 3 }
    => {0=>[3,6], 1=>[1, 4], 2=>[2, 5]}
   Widget.all.to_hash {|w| w.status }
    => {:pending => [<Widget1>,<Widget4>], :complete => [<Widget2>], :awaiting_approval =>[<Widget3>]}

2 comments:

Andrius Chamentauskas said...

Just so you know there's Array#group_by in standard library since ruby 1.8.7 that seems to be doing the same thing.

Taryn said...

Ah! So there is!

When I went looking I couldn't find what I wanted - of course it's in Enumerable, rather than Array.

Ok, thanks for the tip, and good spotting!

Everyone else: nothing to see here then... :)