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?

Antworten:


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

... verdammt, ich liebe Ruby.


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!


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.


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%
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.