Never been to DZone Snippets before?

Snippets is a public source code repository. Easily build up your personal collection of code snippets, categorize them with tags / keywords, and share them with the world

Array to Hash in Ruby (See related posts)

Inspired by something Ryan Carver was trying to do:

a = [1, 2, 3]
Hash[*a.collect { |v|
    [v, v*2]
}.flatten]


It's not as foolproof as his solution, however!

Comments on this post

peter posts on May 21, 2005 at 22:02
testing
therealadam posts on May 21, 2005 at 23:33
Wow, that made my jaw drop. I remixed it as a member of Array and accepting a block to map array keys to Hash values. Just for kicks.


class Array
def to_h(&block)
Hash[*self.collect { |v|
[v, block.call(v)]
}.flatten]
end
end
petef posts on Mar 29, 2007 at 08:35
I renamed therealadam's version to_hash_keys and added a counterpart to_hash_values.

class Array
  def to_hash_keys(&block)
    Hash[*self.collect { |v|
      [v, block.call(v)]
    }.flatten]
  end

  def to_hash_values(&block)
    Hash[*self.collect { |v|
      [block.call(v), v]
    }.flatten]
  end
end


Then I can do this for example:

>> a = ["able", "baker", "charlie"]
>> a.to_hash_values {|v| a.index(v)}
=> {0=>"able", 1=>"baker", 2=>"charlie"}
justinwr posts on Jun 02, 2007 at 14:51
This helped me with a small challenge, of comparing two Arrays to each other, then generating a Hash of the results of that compare.

Here's a little messing about in irb...
>> id_list = (21..31).to_a
=> [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]
>> products_ids = [24, 29, 30, 32]
=> [24, 29, 30, 32]
>> results = Hash[*id_list.collect {|v| [v, products_ids.include?(v)]}.flatten]
=> {27=>false, 22=>false, 28=>false, 23=>false, 29=>true, 24=>true, 30=>true, 25=>false, 31=>false, 26=>false, 21=>false}
>> results.each_pair {|k,v| puts "Key: #{k} is true!" if v == true}
Key: 29 is true!
Key: 24 is true!
Key: 30 is true!


basvk posts on Jan 21, 2008 at 17:30
using zip to create a hash from a keys and a values array:

class << Hash
  def create(keys, values)
    self[*keys.zip(values).flatten]
  end
end


gives:

>> Hash.create(['a', 'b', 'c'], [1, 2, 3])
=> {"a"=>1, "b"=>2, "c"=>3}

bradediger posts on Mar 06, 2008 at 17:13
This should really use flatten_once, not flatten, so that you can do something like x.to_hash_keys{[]} and not have the [] flattened out. flatten_once is something like:

class Array
  def flatten_once
    returning([]) {|ary| each{|x| ary.concat x}}
  end
end
jkndrkn posts on May 06, 2008 at 15:16
@ bradediger: I had trouble getting your flatten_once routine running. Here is my solution:

class Array
def flatten_once
inject([]) { |v, e| v.concat(e)}
end
end
jkndrkn posts on May 06, 2008 at 15:17
Sorry, newbie here:

class Array
    def flatten_once
        inject([]) { |v, e| v.concat(e)}
    end 
end

You need to create an account or log in to post comments to this site.


Click here to browse all 4861 code snippets

Related Posts