update 2012-12-21:
you should use flat_map instead of flatten, i'm too lazy to update the code though.. :P
we can convert hash to array easily using .to_a method for example:
hsh = {:a => 1, :b => 2, :c => 3}
arr = hsh.to_a # -> [[:a, 1], [:b, 2], [:c, 3]]
but there's no built in method to reverse that, there's no .to_hash instance method for array.
to solve that i added a simple instance method for array:
class Array
def to_hash values=nil
Hash[*(values.is_a?(Array) ? self.zip(values) : self).flatten(1)]
end
end
hsh = {:a => 1, :b => 2, :c => 3}
arr = hsh.to_a # -> [[:a, 1], [:b, 2], [:c, 3]]
arr.to_hash == hsh # -> true
[:a,:b,:c].to_hash [1,2,3] # -> {:a => 1, :b => 2, :c => 3}
a little precaution, flatten(1) will not work properly in ruby 1.8.7 or older, therefore it won't be possible to create hash with array as key or value. but there's a simple workaround for that by overriding array flatten method to behave like ruby 1.9.2 in my next post :)