检索嵌套的哈希值ruby

时间:2013-10-07 08:05:29

标签: ruby

我有一个嵌套的Hash:

{
  :a=>{
       :toto=>{
               :foo=>10,
               :bar=>11,
               :baz=>12
              },
       :titi=>"a"
     },
  :b=>{
       :toto=>{
               :foo=>31,
               :bar=>45,
               :baz=>78
              },
       :titi=>"b"
     }
}

我的目标是汇总所有:baz值。我确信在红宝石中有一种漂亮的方法可以做到这一点。有什么想法吗?

感谢。

3 个答案:

答案 0 :(得分:5)

#inject是非常强大的方法,适用于数组和哈希。您可以遍历哈希值并将所需的密钥与总和相加。

hash.inject(0) { |sum, (_,v)| sum += v[:toto][:baz] } # => 90

答案 1 :(得分:1)

h = {
  :a=>{
       :toto=>{
               :foo=>10,
               :bar=>11,
               :baz=>12
              },
       :titi=>"a"
     },
  :b=>{
       :toto=>{
               :foo=>31,
               :bar=>45,
               :baz=>78
              },
       :titi=>"b"
     }
}

h.inject(0){|sum,(_,v)| sum +=v.fetch(:toto,{}).fetch(:baz,0)}

答案 2 :(得分:0)

此方法查找所有:baz元素,无论其路径如何。

h = {
  :a=>{
    :toto=>{
      :foo=>10,
      :bar=>11,
      :baz=>12,
    },
    :titi=>"a"
  },
  :b=>{
    :toto=>{
      :foo=>31,
      :bar=>45,
      :baz=>78,
    },
    :titi=>"b",
  },
}

def sum_baz(hash)
  hash.values.reduce(0) do |memo, elem|
    if elem.is_a?(Hash)
      memo += sum_baz(elem)
      memo += elem[:baz] if elem[:baz]
    end
    memo
  end
end

sum_baz(h) # => 90