【问题标题】:How to merge Ruby hashes如何合并 Ruby 哈希
【发布时间】:2012-01-14 23:02:12
【问题描述】:

如何合并这两个哈希:

{:car => {:color => "red"}}
{:car => {:speed => "100mph"}}

获得:

{:car => {:color => "red", :speed => "100mph"}}

【问题讨论】:

    标签: ruby hashmap


    【解决方案1】:
    h1 = {:car => {:color => "red"}}
    h2 = {:car => {:speed => "100mph"}}
    h3 = h1[:car].merge(h2[:car])
    h4 = {:car => h3}
    

    【讨论】:

    • 哦,对不起,这不太正确......我已经更新了我的帖子
    【解决方案2】:

    有一个Hash#merge方法:

    ruby-1.9.2 > a = {:car => {:color => "red"}}
     => {:car=>{:color=>"red"}} 
    ruby-1.9.2 > b = {:car => {:speed => "100mph"}}
     => {:car=>{:speed=>"100mph"}} 
    ruby-1.9.2 > a.merge(b) {|key, a_val, b_val| a_val.merge b_val }
     => {:car=>{:color=>"red", :speed=>"100mph"}} 
    

    如果需要合并嵌套哈希,可以创建递归方法:

    def merge_recursively(a, b)
      a.merge(b) {|key, a_item, b_item| merge_recursively(a_item, b_item) }
    end
    
    ruby-1.9.2 > merge_recursively(a,b)
     => {:car=>{:color=>"red", :speed=>"100mph"}} 
    

    【讨论】:

    • 是的,我认为递归将成为解决方案的一部分,这正是我所需要的。谢谢你帮助亚历克斯
    • 如果您想直接更改a,请使用a.merge!(b)
    • 也许会对某人有所帮助,如果 a_item 不是哈希,那么我猜上面会失败,这样的事情可能会有所帮助,它将覆盖您在 'b' 中指定的 'a' 中的所有值,例如,您的“a”有一些默认值,“b”有一些实际的运行时值。 def merge_recursively(a, b) a.merge!(b) {|key, a_item, b_item| if a_item.is_a?(Hash) merge_recursively(a_item, b_item) else b_item end } end
    【解决方案3】:

    Hash#deep_merge

    Rails 3.0+

    a = {:car => {:color => "red"}}
    b = {:car => {:speed => "100mph"}}
    a.deep_merge(b)
    => {:car=>{:color=>"red", :speed=>"100mph"}} 
    

    来源:https://speakerdeck.com/u/jeg2/p/10-things-you-didnt-know-rails-could-do 幻灯片 24

    还有,

    http://apidock.com/rails/v3.2.13/Hash/deep_merge

    【讨论】:

    • 如果您不使用 Rails,请使用 require 'active_support/core_ext/hash/deep_merge' 将其引入。
    【解决方案4】:

    您可以使用 ruby​​ 库中定义的merge 方法。 https://ruby-doc.org/core-2.2.0/Hash.html#method-i-merge


    示例

    h1={"a"=>1,"b"=>2} 
    h2={"b"=>3,"c"=>3} 
    h1.merge!(h2)
    

    它会给你这样的输出{"a"=>1,"b"=>3,"c"=>3}

    Merge 方法不允许重复键,所以键 b 将从 2 到 3 被覆盖。

    要克服上述问题,您可以像这样破解merge 方法。

    h1.merge(h2){|k,v1,v2|[v1,v2]}
    

    上面的代码sn-p会给你输出

    {"a"=>1,"b"=>[2,3],"c"=>3}
    

    【讨论】:

      猜你喜欢
      • 2021-07-25
      • 2019-02-21
      • 2019-08-08
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      • 2014-06-15
      • 2011-11-19
      相关资源
      最近更新 更多