2009-04-11 131 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>