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(*数组)
。就是这样!