如何合并Ruby哈希

sky*_*ter 48 ruby hashmap

如何合并这两个哈希:

{:car => {:color => "red"}}
{:car => {:speed => "100mph"}}
Run Code Online (Sandbox Code Playgroud)

要得到:

{:car => {:color => "red", :speed => "100mph"}}
Run Code Online (Sandbox Code Playgroud)

Ali*_*kau 64

有一种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"}} 
Run Code Online (Sandbox Code Playgroud)

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

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"}} 
Run Code Online (Sandbox Code Playgroud)

  • 如果你想直接改变`a`,请使用`a.merge!(b)`. (3认同)

And*_*rei 36

Hash#deep_merge

Rails 3.0+

a = {:car => {:color => "red"}}
b = {:car => {:speed => "100mph"}}
a.deep_merge(b)
=> {:car=>{:color=>"red", :speed=>"100mph"}} 
Run Code Online (Sandbox Code Playgroud)

资料来源:https://speakerdeck.com/u/jeg2/p/10-things-you-didnt-know-rails-could-do Slide 24

也,

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

  • 如果你没有使用Rails,请使用`require'active_support/core_ext/hash/deep_merge'`将其拉入. (3认同)

Muk*_*pta 10

您可以使用mergeruby库中定义的方法.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)
Run Code Online (Sandbox Code Playgroud)

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

Merge方法不允许重复键,因此键b将被覆盖2到3.

要克服上述问题,你可以破解这样的merge方法.

h1.merge(h2){|k,v1,v2|[v1,v2]}
Run Code Online (Sandbox Code Playgroud)

上面的代码片段将为您提供输出

{"a"=>1,"b"=>[2,3],"c"=>3}
Run Code Online (Sandbox Code Playgroud)