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?

Réponses:


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

... putain, j'adore Ruby.


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!


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.


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%
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.