Comment créer un hachage Ruby à partir de deux tableaux de taille égale?

92

J'ai deux tableaux

a = [:foo, :bar, :baz, :bof]

et

b = ["hello", "world", 1, 2]

Je voudrais

{:foo => "hello", :bar => "world", :baz => 1, :bof => 2}

Un moyen de faire ça?

maček
la source

Réponses:

203
h = Hash[a.zip b] # => {:baz=>1, :bof=>2, :bar=>"world", :foo=>"hello"}

... putain, j'adore Ruby.

jtbandes
la source
3
C'est assez évident, mais si quelqu'un se demande, si vous voulez obtenir les tableaux d'origine du nouveau hachage, vous pouvez simplement appeler h.keyset h.values.
bhaity
38

Je voulais juste souligner qu'il existe une façon légèrement plus propre de faire cela:

h = a.zip(b).to_h # => {:foo=>"hello", :bar=>"world", :baz=>1, :bof=>2}

Faut être d'accord sur la partie "I love Ruby" cependant!

Lethjakman
la source
16

Celui-ci, ça va?

[a, b].transpose.to_h

Si vous utilisez Ruby 1.9:

Hash[ [a, b].transpose ]

J'ai l'impression d' a.zip(b)être amaître et besclave, mais dans ce style, ils sont plats.

Junichi Ito
la source
0

Juste pour la curiosité:

require 'fruity'

a = [:foo, :bar, :baz, :bof]
b = ["hello", "world", 1, 2]

compare do
  jtbandes { h = Hash[a.zip b] }
  lethjakman { h = a.zip(b).to_h }
  junichi_ito1 { [a, b].transpose.to_h }
  junichi_ito2 { Hash[ [a, b].transpose ] } 
end

# >> Running each test 8192 times. Test will take about 1 second.
# >> lethjakman is similar to junichi_ito1
# >> junichi_ito1 is similar to jtbandes
# >> jtbandes is similar to junichi_ito2

compare do 
  junichi_ito1 { [a, b].transpose.to_h }
  junichi_ito2 { Hash[ [a, b].transpose ] } 
end

# >> Running each test 8192 times. Test will take about 1 second.
# >> junichi_ito1 is faster than junichi_ito2 by 19.999999999999996% ± 10.0%
l'homme d'étain
la source