Wie erstelle ich einen Ruby-Hash aus zwei gleich großen Arrays?

92

Ich habe zwei Arrays

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

und

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

Ich will

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

Wie kann man das machen?

maček
quelle

Antworten:

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

... verdammt, ich liebe Ruby.

jtbandes
quelle
3
Es ist ziemlich offensichtlich, aber wenn sich jemand fragt, ob Sie die ursprünglichen Arrays aus dem neuen Hash erhalten möchten, können Sie einfach h.keysund aufrufen h.values.
Bhaity
38

Ich wollte nur darauf hinweisen, dass es einen etwas saubereren Weg gibt, dies zu tun:

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

Ich muss mich allerdings auf den Teil "Ich liebe Ruby" einigen!

Lethjakman
quelle
16

Wie wäre es mit diesem?

[a, b].transpose.to_h

Wenn Sie Ruby 1.9 verwenden:

Hash[ [a, b].transpose ]

Ich fühle mich a.zip(b)wie aMeister und bSklave, aber in diesem Stil sind sie flach.

Junichi Ito
quelle
0

Nur aus Neugier:

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%
der Blechmann
quelle