2009-04-11 94 views
16

我有两个数组是这样的:转换键数组和值数组到哈希Ruby中

keys = ['a', 'b', 'c'] 
values = [1, 2, 3] 

是否有Ruby的一个简单的方法对这些阵列转换成以下哈希?

{ 'a' => 1, 'b' => 2, 'c' => 3 } 

这是我的做法,但我觉得应该有一个内置的方法来轻松地做到这一点。

def arrays2hash(keys, values) 
    hash = {} 
    0.upto(keys.length - 1) do |i| 
     hash[keys[i]] = values[i] 
    end 
    hash 
end 

回答

50

以下作品1.8.7:

keys = ["a", "b", "c"] 
values = [1, 2, 3] 
zipped = keys.zip(values) 
=> [["a", 1], ["b", 2], ["c", 3]] 
Hash[zipped] 
=> {"a"=>1, "b"=>2, "c"=>3} 

这似乎不是在旧版本的Ruby(1.8.6)的工作。下面列出的是向后兼容:

Hash[*keys.zip(values).flatten] 
+2

So Hash [keys.zip(values)] then? – 2009-04-11 20:55:40

8

另一种方法是使用each_with_index:

hash = {} 
keys.each_with_index { |key, index| hash[key] = values[index] } 

hash # => {"a"=>1, "b"=>2, "c"=>3} 
5

同样可以使用Array#transpose方法来完成。如果您使用的Ruby版本> = 2.1,您可以采取的方法Array#to_h的优势,否则使用你的老朋友,Hash::[]

keys = ['a', 'b', 'c'] 
values = [1, 2, 3] 
[keys, values].transpose.to_h 
# => {"a"=>1, "b"=>2, "c"=>3} 
Hash[[keys, values].transpose] 
# => {"a"=>1, "b"=>2, "c"=>3} 
0

试试这个,这样一来后者d将覆盖前一个c

irb(main):001:0> hash = Hash[[[1,2,3,3], ['a','b','c','d']].transpose] 
=> {1=>"a", 2=>"b", 3=>"d"} 
irb(main):002:0>