如何" zip"两个数组成哈希

时间:2014-04-16 15:26:02

标签: ruby arrays hashmap

我想" zip"将两个数组转换为Hash。

自:

['BO','BR']
['BOLIVIA','BRAZIL']

要:

{BO: 'BOLIVIA', BR:'BRAZIL'}

我该怎么做?

5 个答案:

答案 0 :(得分:24)

我会这样做:

keys = ['BO','BR']
values = ['BOLIVIA','BRAZIL']

Hash[keys.zip(values)]
# => {"BO"=>"BOLIVIA", "BR"=>"BRAZIL"}

如果你想要键的符号,那么:

Hash[keys.map(&:to_sym).zip(values)]
# => {:BO=>"BOLIVIA", :BR=>"BRAZIL"}

在Ruby 2.1.0或更高版本中,您可以将它们写为:

keys.zip(values).to_h
keys.map(&:to_sym).zip(values).to_h

答案 1 :(得分:4)

只需使用两个Array,然后转置它,然后生成Hash

keys = ['BO','BR']
values = ['BOLIVIA','BRAZIL']
Hash[[keys,values].transpose]
# => {"BO"=>"BOLIVIA", "BR"=>"BRAZIL"}

或更新的红宝石版本:

[keys,values].transpose.to_h

答案 2 :(得分:2)

相当可读的版本将是:

keys = ['BO','BR']
values = ['BOLIVIA','BRAZIL']

keys.zip(values).each_with_object({}) do |(key, value), hash|
  hash[key.to_sym] = value
end

答案 3 :(得分:2)

具有讽刺意味的是,如果你只是在你的问题中撒上一些点和下划线,它就会起作用:

  

我想在zip ash

中“to_h”两个数组
ary1.zip(ary2).to_h
# => { 'BO' => 'BOLIVIA', 'BR' => 'BRAZIL' }

实际上,您在输出哈希中指定密钥应为Symbol而不是String s,因此我们需要先将它们转换为:

ary1.map(&:to_sym).zip(ary2).to_h
# => { BO: 'BOLIVIA', BR: 'BRAZIL' }

答案 4 :(得分:0)

您可以创建一个压缩数组,然后将数组转换为哈希,如下所示:

keys = ['BO','BR']
values = ['BOLIVIA','BRAZIL']    
array = key.zip(values) # => [['BO','BOLIVIA'],['BR','BRAZIL']]
hash = array.to_h # => {'BO' => 'BOLIVIA','BR' => 'BRAZIL'}