Ruby on rails Ruby将两个数组合并为一个数组

Ruby on rails Ruby将两个数组合并为一个数组,ruby-on-rails,ruby,arrays,hash,iterator,Ruby On Rails,Ruby,Arrays,Hash,Iterator,这是我的情况。我有两个数组 @names = ["Tom", "Harry", "John"] @emails = ["tom@gmail.com", "h@gmail.com", "j@gmail.com"] 我想将这两个元素组合成一个名为@list的数组/散列,这样我就可以在视图中迭代如下内容: <% @list.each do |item| %> <%= item.name %><br> <%= item.email %><br&g

这是我的情况。我有两个数组

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

@emails = ["tom@gmail.com", "h@gmail.com", "j@gmail.com"]
我想将这两个元素组合成一个名为
@list
的数组/散列,这样我就可以在视图中迭代如下内容:

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



我很难理解如何才能实现这个目标。有什么想法吗?

@names=[“汤姆”、“哈利”、“约翰”]
@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"
@电子邮件=[”tom@gmail.com", "h@gmail.com", "j@gmail.com"] @list=@names.zip(@emails) #=>[[“汤姆”tom@gmail.com“],[“哈利”,”h@gmail.com“],[“约翰”,”j@gmail.com"]] @列出每个do |名称、电子邮件| #当一个块被传递给一个数组时,你可以自动“解构” #该数组分为多个命名变量。是的,鲁比! p“#{name}” 结束 #=>“汤姆” #=>“哈利” #=>“约翰” @URL=[“yahoo.com”、“ebay.com”、“google.com”] #将多个阵列压缩在一起 @name.zip(@email,@url)。每个都有| name,email,url| p“#{name}::#{url}” 结束 #=>“汤姆::雅虎网站” #=>“Harry::ebay.com” #=>“John::google.com”
您可以使用
zip
将两个数组压缩在一起,然后使用
map
从名称电子邮件对创建
Item
对象。假设您有一个
类,其
初始化
方法接受散列,则代码如下所示:

<% @list.each do |item| %>
<%= item.name %><br>
<%= item.email %><br>
<% end %>
@list = @names.zip(@emails).map do |name, email|
  Item.new(:name => name, :email => email)
end
这将给您一个名为=>电子邮件的哈希值。

只是为了与众不同:

[@names, @emails, @urls].transpose.each do |name, email, url|
  # . . .
end
这类似于它所做的,只是在这种情况下,不会有任何短行的零填充;如果缺少某些内容,将引发异常。

尝试此操作

Hash[@names.zip(@emails)]
您有两个数组 @姓名=[“汤姆”、“哈里”、“约翰”]

@电子邮件=[”tom@gmail.com", "h@gmail.com", "j@gmail.com“]

@names.zip(@emails)将@emails合并到与索引相关联的@names中,如下所示 [“汤姆”tom@gmail.com“],[“哈利”,”h@gmail.com“],[“约翰”,”j@gmail.com“]]

现在我们可以使用
散列[@names.zip(@emails)]

Aha!这就是
zip
的用途!不知何故,它从未真正进入我的标准工具箱。很好+1此解决方案是否仍然适用?我添加了另一个名为@URL=[“yahoo.com”、“ebay.com”、“google.com]”的实例变量。@lou1221是;请参阅上面更新的答案
Array#zip
可以接受任意数量的参数。适用于这种情况,但未来的读者要注意:这不是一个通用的解决方案,因为如果
names
email
是包含数组的数组,
flatten
将递归运行。在Ruby 1.9下,您可以简单地执行:
Hash[names.zip(emails)]如果需要,展平(1)将防止递归。@WayneConrad是,但展平(1.8.6)不接受参数;如果可以使用
flatten(1)
,则可以使用不需要展平的
Hash。[]
格式。(除1.9版外,还有1.8.7版)或
names.zip(电子邮件)。转置技巧非常棒。感谢您发布本文,我正在寻找Python的
zip(*数组)
。就是这样!