如何合并 Ruby 哈希
Posted
技术标签:
【中文标题】如何合并 Ruby 哈希【英文标题】:How to merge Ruby hashes 【发布时间】:2012-01-14 23:02:12 【问题描述】:如何合并这两个哈希:
:car => :color => "red"
:car => :speed => "100mph"
获得:
:car => :color => "red", :speed => "100mph"
【问题讨论】:
【参考方案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
【讨论】:
以上是关于如何合并 Ruby 哈希的主要内容,如果未能解决你的问题,请参考以下文章