如何合并 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 哈希的主要内容,如果未能解决你的问题,请参考以下文章

如何表示将 ruby​​ 哈希转换为 yaml 的 aws 内部函数

如何将 JSON 转换为 Ruby 哈希

如何在 Ruby 中复制哈希?

Ruby如何格式化嵌套哈希

如何从哈希数组创建 ruby​​ 类的实例?

如何按此哈希数组进行分组(可枚举)[Ruby,Rails]