-2

我有一个这样的嵌套哈希:

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

我的目标是总结所有的:baz价值。我确信在 ruby​​ 中有一种漂亮的方法可以做到这一点。任何想法?

谢谢。

4

3 回答 3

6

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

hash.inject(0) { |sum, (_,v)| sum += v[:toto][:baz] } # => 90
于 2013-10-07T08:09:20.650 回答
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)}
于 2013-10-07T08:11:02.483 回答
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
于 2013-10-07T08:12:57.773 回答