Я хочу "сжать" два массива в хэш.
От:
['BO','BR']
['BOLIVIA','BRAZIL']
Для того, чтобы:
{BO: 'BOLIVIA', BR:'BRAZIL'}
Как мне это сделать?
Я хочу "сжать" два массива в хэш.
От:
['BO','BR']
['BOLIVIA','BRAZIL']
Для того, чтобы:
{BO: 'BOLIVIA', BR:'BRAZIL'}
Как мне это сделать?
Я бы сделал это следующим образом:
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
Просто используйте одиночный Array
из двух, а затем транспонируйте его и создайте Hash
:
keys = ['BO','BR']
values = ['BOLIVIA','BRAZIL']
Hash[[keys,values].transpose]
# => {"BO"=>"BOLIVIA", "BR"=>"BRAZIL"}
или для более новой версии ruby:
[keys,values].transpose.to_h
Довольно читаемая версия:
keys = ['BO','BR']
values = ['BOLIVIA','BRAZIL']
keys.zip(values).each_with_object({}) do |(key, value), hash|
hash[key.to_sym] = value
end
По иронии судьбы, если вы просто покроете несколько точек и подчеркивания в свой вопрос, это просто работает:
Я хочу "
zip
" два массива вto_h
ash
ary1.zip(ary2).to_h
# => { 'BO' => 'BOLIVIA', 'BR' => 'BRAZIL' }
На самом деле, вы указали в своем хеше вывода, что ключи должны быть Symbol
not String
s, поэтому нам нужно сначала их преобразовать:
ary1.map(&:to_sym).zip(ary2).to_h
# => { BO: 'BOLIVIA', BR: 'BRAZIL' }
Вы можете сделать zipped массив, а затем преобразовать массив в хеш, например:
keys = ['BO','BR']
values = ['BOLIVIA','BRAZIL']
array = key.zip(values) # => [['BO','BOLIVIA'],['BR','BRAZIL']]
hash = array.to_h # => {'BO' => 'BOLIVIA','BR' => 'BRAZIL'}