Ruby将两个arrays合并为一个

这是我的情况。 我有2个arrays

@names = ["Tom", "Harry", "John"] @emails = ["tom@gmail.com", "h@gmail.com", "j@gmail.com"] 

我想将这两个组合成一些名为@list Array / Hash,这样我就可以在我的视图中迭代这样的东西:

  

我无法理解如何实现这一目标。 有什么想法吗?

 @names = ["Tom", "Harry", "John"] @emails = ["tom@gmail.com", "h@gmail.com", "j@gmail.com"] @list = @names.zip( @emails ) #=> [["Tom", "tom@gmail.com"], ["Harry", "h@gmail.com"], ["John", "j@gmail.com"]] @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 " #=> "Harry " #=> "John " @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  :: yahoo.com" #=> "Harry  :: ebay.com" #=> "John  :: google.com" 

只是为了与众不同:

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

这类似于Array#zip所做的,除了在这种情况下不会有任何短行的nil填充; 如果缺少某些东西,将引发exception。

 Hash[*names.zip(emails).flatten] 

这将为您提供名称=>电子邮件的哈希。

您可以使用zip将两个数组压缩在一起,然后map以从名称 – 电子邮件对创建Item对象。 假设你有一个其initialize方法接受哈希的Item类,代码如下所示:

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

试试这个

 Hash[@names.zip(@emails)] 

你有两个数组@names = [“Tom”,“Harry”,“John”]

@emails = [“tom@gmail.com”,“h @ gmail.com”,“j @ gmail.com”]

@ names.zip(@emails)它将@emails合并到与他们的索引关联的@names,如下面[[“Tom”,“tom@gmail.com”],[“Harry”,“h @ gmail.com”] ,[“John”,“j @ gmail.com”]]

现在我们可以使用Hash [@ names.zip(@emails)]将此数组转换为哈希