Как "застегнуть" два массива в хэш Я хочу "сжать" два массива в хэш. От: ['BO','BR'] ['BOLIVIA','BRAZIL'] Для того, чтобы: {BO: 'BOLIVIA', BR:'BRAZIL'} Как мне это сделать? Ответ 1 Я бы сделал это следующим образом: 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 Ответ 2 Просто используйте одиночный Array из двух, а затем транспонируйте его и создайте Hash: keys = ['BO','BR'] values = ['BOLIVIA','BRAZIL'] Hash[[keys,values].transpose] # => {"BO"=>"BOLIVIA", "BR"=>"BRAZIL"} или для более новой версии ruby: [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 Ответ 4 По иронии судьбы, если вы просто покроете несколько точек и подчеркивания в свой вопрос, это просто работает: Я хочу "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' } Ответ 5 Вы можете сделать zipped массив, а затем преобразовать массив в хеш, например: keys = ['BO','BR'] values = ['BOLIVIA','BRAZIL'] array = key.zip(values) # => [['BO','BOLIVIA'],['BR','BRAZIL']] hash = array.to_h # => {'BO' => 'BOLIVIA','BR' => 'BRAZIL'}
Ответ 1 Я бы сделал это следующим образом: 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
Ответ 2 Просто используйте одиночный Array из двух, а затем транспонируйте его и создайте Hash: keys = ['BO','BR'] values = ['BOLIVIA','BRAZIL'] Hash[[keys,values].transpose] # => {"BO"=>"BOLIVIA", "BR"=>"BRAZIL"} или для более новой версии ruby: [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
Ответ 4 По иронии судьбы, если вы просто покроете несколько точек и подчеркивания в свой вопрос, это просто работает: Я хочу "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' }
Ответ 5 Вы можете сделать zipped массив, а затем преобразовать массив в хеш, например: keys = ['BO','BR'] values = ['BOLIVIA','BRAZIL'] array = key.zip(values) # => [['BO','BOLIVIA'],['BR','BRAZIL']] hash = array.to_h # => {'BO' => 'BOLIVIA','BR' => 'BRAZIL'}