Преобразование массива ключей и массива значений в хеш в Ruby - PullRequest
18 голосов
/ 12 апреля 2009

У меня есть два таких массива:

keys = ['a', 'b', 'c']
values = [1, 2, 3]

Есть ли в Ruby простой способ конвертировать эти массивы в следующий хеш?

{ 'a' => 1, 'b' => 2, 'c' => 3 }

Вот мой способ сделать это, но я чувствую, что должен быть встроенный метод, чтобы легко сделать это.

def arrays2hash(keys, values)
  hash = {}
  0.upto(keys.length - 1) do |i|
      hash[keys[i]] = values[i]
  end
  hash
end

Ответы [ 5 ]

52 голосов
/ 12 апреля 2009

Следующие работы в 1.8.7:

keys = ["a", "b", "c"]
values = [1, 2, 3]
zipped = keys.zip(values)
=> [["a", 1], ["b", 2], ["c", 3]]
Hash[zipped]
=> {"a"=>1, "b"=>2, "c"=>3}

Похоже, что это не работает в более старых версиях Ruby (1.8.6). Следующее должно быть обратно совместимым:

Hash[*keys.zip(values).flatten]
10 голосов
/ 12 апреля 2009

Другой способ - использовать each_with_index:

hash = {}
keys.each_with_index { |key, index| hash[key] = values[index] }

hash # => {"a"=>1, "b"=>2, "c"=>3}
6 голосов
/ 27 июля 2014

То же самое можно сделать, используя метод Array#transpose. Если вы используете версию Ruby> = 2.1 , вы можете воспользоваться методом Array#to_h, в противном случае используйте своего старого друга, Hash::[]

keys = ['a', 'b', 'c']
values = [1, 2, 3]
[keys, values].transpose.to_h
# => {"a"=>1, "b"=>2, "c"=>3}
Hash[[keys, values].transpose]
# => {"a"=>1, "b"=>2, "c"=>3}
1 голос
/ 12 апреля 2009
0 голосов
/ 13 августа 2015

Попробуйте, таким образом, последний d заменит прежний c

irb(main):001:0>  hash = Hash[[[1,2,3,3], ['a','b','c','d']].transpose]
=> {1=>"a", 2=>"b", 3=>"d"}
irb(main):002:0>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...