Come costruire un hash Ruby da due array di uguali dimensioni?


92

Ho due array

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

e

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

Voglio

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

Qualche modo per farlo?

Risposte:


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

... accidenti, amo Ruby.


3
È abbastanza ovvio ma se qualcuno si chiede, se vuoi ottenere gli array originali dal nuovo hash puoi semplicemente chiamare h.keyse h.values.
bhaity

38

Volevo solo sottolineare che esiste un modo leggermente più pulito per farlo:

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

Devo però essere d'accordo sulla parte "I love Ruby"!


16

Che ne dici di questo?

[a, b].transpose.to_h

Se usi Ruby 1.9:

Hash[ [a, b].transpose ]

Mi a.zip(b)sembra che asia padrone ed bè schiavo, ma in questo stile sono piatti.


0

Solo per 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%
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.