如何“拉链”两个数组到哈希

问题描述 投票:14回答:5

我想“拉链”两个数组到一个哈希。

从:

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

至:

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

我该怎么做?

ruby arrays hashmap
5个回答
29
投票

我会做这种方式:

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

[编辑2019年9月12日]随着Ruby 2.5的,你可以使用.transform_keys

Hash[keys.zip(values)].transform_keys { |k| k.to_sym }

5
投票

只要使用二进制补码的单Array,然后转它,并产生Hash

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

或更新版本的红宝石:

[keys,values].transpose.to_h

3
投票

相当可读的版本是:

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

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

3
投票

讽刺的是,如果你只是撒上一些点,并强调到你的问题,它只是工作:

我想“zip”两个数组into_hash

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

其实,你在你的输出散列指定的键应该是Symbols不Strings,所以我们需要把它们先转换:

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

0
投票

你可以做一个压缩数组,然后将数组转换成散列像这样:

keys = ['BO','BR']
values = ['BOLIVIA','BRAZIL']    
array = key.zip(values) # => [['BO','BOLIVIA'],['BR','BRAZIL']]
hash = array.to_h # => {'BO' => 'BOLIVIA','BR' => 'BRAZIL'}
© www.soinside.com 2019 - 2024. All rights reserved.