我想" zip"将两个数组转换为Hash。
自:
['BO','BR']
['BOLIVIA','BRAZIL']
要:
{BO: 'BOLIVIA', BR:'BRAZIL'}
我该怎么做?
答案 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
ashto_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'}