web-dev-qa-db-ja.com

Ruby 2つの配列を1つにマージする

これが私の状況です。私は2つのアレイを持っています

@names = ["Tom", "Harry", "John"]

@emails = ["[email protected]", "[email protected]", "[email protected]"]

これら2つを@listという配列/ハッシュに結合して、ビューで次のように繰り返すことができるようにします。

<% @list.each do |item| %>
<%= item.name %><br>
<%= item.email %><br>
<% end %>

この目標を達成する方法を理解するのに苦労しています。何かご意見は?

24
lou1221
@names  = ["Tom", "Harry", "John"]
@emails = ["[email protected]", "[email protected]", "[email protected]"]

@list = @names.Zip( @emails )
#=> [["Tom", "[email protected]"], ["Harry", "[email protected]"], ["John", "[email protected]"]]

@list.each do |name,email|
  # When a block is passed an array you can automatically "destructure"
  # the array parts into named variables. Yay for Ruby!
  p "#{name} <#{email}>"
end
#=> "Tom <[email protected]>"
#=> "Harry <[email protected]>"
#=> "John <[email protected]>"

@urls = ["yahoo.com", "ebay.com", "google.com"]

# Zipping multiple arrays together
@names.Zip( @emails, @urls ).each do |name,email,url|
  p "#{name} <#{email}> :: #{url}"
end
#=> "Tom <[email protected]> :: yahoo.com"
#=> "Harry <[email protected]> :: ebay.com"
#=> "John <[email protected]> :: google.com"
51
Phrogz

ただ違う:

[@names, @emails, @urls].transpose.each do |name, email, url|
  # . . .
end

これは Array#Zip と似ていますが、この場合、短い行のパディングがゼロにならない点が異なります。何かが欠けている場合、例外が発生します。

16
DigitalRoss
Hash[*names.Zip(emails).flatten]

これにより、名前=> emailのハッシュが得られます。

7
Sean Hill

これを試して

Hash[@names.Zip(@emails)]

2つの配列@ names = ["Tom"、 "Harry"、 "John"]があります

@emails = ["[email protected]"、 "[email protected]"、 "[email protected]"]

@ names.Zip(@emails)@ emailsを以下のようにインデックスに関連付けられた@namesにマージします[["Tom"、 "[email protected]"]、["Harry"、 "[email protected]"] 、["John"、 "[email protected]"]]

これで、Hash [@ names.Zip(@emails)]を使用してこの配列をハッシュに変換できます。

Zipを使用して2つの配列を圧縮し、次にmapを使用してname-email-pairsからItemオブジェクトを作成できます。 Itemメソッドがハッシュを受け入れるinitializeクラスがあるとすると、コードは次のようになります。

@list = @names.Zip(@emails).map do |name, email|
  Item.new(:name => name, :email => email)
end
3
sepp2k