这是我的情况。我有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 %>
我无法理解如何实现这一目标。有什么想法吗?
答案 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)]