【发布时间】:2012-01-14 23:02:12
【问题描述】:
如何合并这两个哈希:
{:car => {:color => "red"}}
{:car => {:speed => "100mph"}}
获得:
{:car => {:color => "red", :speed => "100mph"}}
【问题讨论】:
如何合并这两个哈希:
{:car => {:color => "red"}}
{:car => {:speed => "100mph"}}
获得:
{:car => {:color => "red", :speed => "100mph"}}
【问题讨论】:
h1 = {:car => {:color => "red"}}
h2 = {:car => {:speed => "100mph"}}
h3 = h1[:car].merge(h2[:car])
h4 = {:car => h3}
【讨论】:
有一个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)。
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
还有,
【讨论】:
require 'active_support/core_ext/hash/deep_merge' 将其引入。
您可以使用 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}
【讨论】: