2011-01-01 14 views
20

これは私の状況です。私は悩みを理解したよRuby 1つに2つの配列をマージする

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

:私はいくつかの配列/ハッシュの中にこれらの2を組み合わせたい2つの配列

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

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

ので、私はその後、私の見解では、このような何かを繰り返すことができ@list呼ばれています私はこの目標を達成することができます。何かご意見は?

答えて

46
@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" 
+4

Aha!だから*これは 'ジップ'のためのものです!それはどういうわけか、私の標準的なツールボックスに実際には入っていませんニース。 +1 – Matchu

+0

このソリューションはまだ適用可能でしょうか?@urls = ["yahoo.com"、 "ebay.com"、 "google.com"]という別のインスタンス変数を追加しました。 – lou1221

+0

@ lou1221はい。上記の更新された答えをご覧ください。 'Array#zip'は任意の数の引数を取ります。 – Phrogz

3

あなたは、名前と電子メールのペアからItemオブジェクトを作成するために、2つの配列と、その後mapを一緒に圧縮するzipを使用することができます。あなたはそのinitializeメソッドハッシュを受け入れるItemクラスを持っていると仮定すると、コードは次のようになります。これはあなたの名前=> Eメールでハッシュを与える

@list = @names.zip(@emails).map do |name, email| 
    Item.new(:name => name, :email => email) 
end 
7
Hash[*names.zip(emails).flatten] 

+1

この状況では動作しますが、将来の読者は注意してください: '名前'または '電子メール'のいずれかが配列を含む配列だった場合、 'flatten'が再帰的に実行されるため、 – Matchu

+5

Ruby 1.9で簡単に行うことができます: 'Hash [names.zip(emails)]' – Phrogz

+2

flatten(1)は必要に応じて再帰を防ぎます。 –

15

だけ異なるようにする:

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

これはつまり、この場合には、短い行の任意のゼロパディングは存在しません除いArray#zipが何に似ています。何かが見つからない場合、例外が発生します。

+5

転置に関するヒントは素晴らしいです。これを投稿してくれてありがとう – lou1221

+1

私はPythonの 'zip(* arrays)'を探していました。これだよ! – Droogans

3

次の2つのアレイ @names = [ "トム"、 "ハリー"、 "ジョン"]

@emailsの= [ "[email protected]" を持って、この

Hash[@names.zip(@emails)] 

をお試しください"[email protected]"、 "[email protected]"]

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

今度はこの配列をハッシュに変換できます。 ハッシュ[@ names.zip(@emails)]

関連する問題