Ruby将两个阵列合并为一个

时间:2011-01-01 02:23:01

标签: ruby-on-rails ruby arrays hash iterator

这是我的情况。我有2个阵列

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

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

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

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

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

5 个答案:

答案 0 :(得分:49)

@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 <tom@gmail.com>"
#=> "Harry <h@gmail.com>"
#=> "John <j@gmail.com>"

@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 <tom@gmail.com> :: yahoo.com"
#=> "Harry <h@gmail.com> :: ebay.com"
#=> "John <j@gmail.com> :: google.com"

答案 1 :(得分:16)

只是为了与众不同:

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

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

答案 2 :(得分:7)

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

这将为您提供名称=&gt;的哈希值电子邮件。

答案 3 :(得分:3)

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

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

答案 4 :(得分:3)

试试这个

Hash[@names.zip(@emails)]

你有两个阵列 @names = [“汤姆”,“哈利”,“约翰”]

@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”]]

现在我们可以使用这个数组转换为哈希 散列[@ names.zip(@emails)]