【问题标题】:Ruby Merging Two Arrays into OneRuby 将两个数组合并为一个
【发布时间】:2011-06-02 03:51:07
【问题描述】:

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

@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 %>

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

【问题讨论】:

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


    【解决方案1】:
    @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"
    

    【讨论】:

    • 啊哈!所以 this 就是 zip 的用途!它不知何故从未真正进入我的标准工具箱。好的。 +1
    • 这个解决方案是否仍然适用我添加了另一个名为 @urls = ["yahoo.com", "ebay.com", "google.com"] 的实例变量。
    • @lou1221 是的;请参阅上面的更新答案。 Array#zip 可以接受任意数量的参数。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:
      Hash[*names.zip(emails).flatten]
      

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

      【讨论】:

      • 适用于这种情况,但未来的读者要注意:这不是一个通用的解决方案,因为如果 namesemails 是包含数组的数组,flatten 将递归运行。跨度>
      • 在 Ruby 1.9 下你可以简单地做:Hash[ names.zip(emails) ]
      • 如果需要,flatten(1) 将防止递归。
      • @WayneConrad 是,但Array#flatten 不接受 1.8.6 中的参数;如果您可以使用flatten(1),那么您可以使用不需要展平的Hash.[] 形式。 (除了 1.9 之外,两者都在 1.8.7 中可用。)
      • names.zip(emails).to_h
      【解决方案4】:

      只是为了与众不同:

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

      这类似于Array#zip 所做的,只是在这种情况下不会有任何短行的零填充;如果缺少某些内容,则会引发异常。

      【讨论】:

      • 转置的技巧很棒。感谢您发布此内容
      • 我正在寻找 Python 的 zip(*arrays)。就是这个!
      【解决方案5】:

      试试这个

      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)]

      【讨论】:

        猜你喜欢
        • 2021-07-16
        • 2012-11-19
        • 1970-01-01
        • 2019-08-30
        • 2022-01-10
        • 2014-05-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多