微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用其他哈希值构造一个哈希值

如何解决用其他哈希值构造一个哈希值

| 我想加入2个或更多这样的哈希。
h1 = { :es => { :hello  => \"You\" } }
h2 = { :es => { :bye => \"Man\" } } 
我怎么能得到这个?
h1 + h2 = { :es => { :hello => \"you\",:bye => \"Man\" } }
谢谢。     

解决方法

您想要的是deep_merge方法。正是您想要的。
ruby-1.9.2-p136 :001 > {:es => {:hello => \"You\" } }.deep_merge({:es => {:bye => \"Man\"}})
=> {:es=>{:hello=>\"You\",:bye=>\"Man\"}}
http://apidock.com/rails/ActiveSupport/CoreExtensions/Hash/DeepMerge/deep_merge     ,
irb(main):001:0> h1 = {:es => {:hello => \"You\"}}
=> {:es=>{:hello=>\"You\"}}
irb(main):002:0> h2 = {:es => {:bye => \"Man\"}}
=> {:es=>{:bye=>\"Man\"}}
irb(main):003:0> h1.each_key {|x| h1[x].merge! h2[x]}
=> {:es=>{:bye=>\"Man\",:hello=>\"You\"}}
    ,与activesupport的deep_merge类似,但具有功能性方法。递归工作:
class Hash
  def inner_merge(other_hash)
    other_hash.inject(self) do |acc,(key,value)|
      if (acc_value = acc[key]) && acc_value.is_a?(Hash) && value.is_a?(Hash)
        acc.merge(key => acc_value.inner_merge(value))
      else
        acc.merge(key => value)
      end
    end       
  end
end

h1.inner_merge(h2) #=> {:es=>{:hello=>\"You\",:bye=>\"Man\"}}
    ,如果您不使用ActiveSupport,则此Proc将执行深度合并。 1.8.7和1.9.2兼容。
dm = lambda {|l,r| l.merge(r) {|k,ov,nv| l[k] = ov.is_a?(Hash) ? dm[ov,nv || {}] : nv} }
dm[h1,h2]
#  => {:es=>{:hello=>\"You\",:bye=>\"Man\"}} 
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。