Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 检索嵌套的哈希值_Ruby - Fatal编程技术网

Ruby 检索嵌套的哈希值

Ruby 检索嵌套的哈希值,ruby,Ruby,我有一个嵌套哈希,如下所示: { :a=>{ :toto=>{ :foo=>10, :bar=>11, :baz=>12 }, :titi=>"a" }, :b=>{ :toto=>{ :foo=>31, :

我有一个嵌套哈希,如下所示:

{
  :a=>{
       :toto=>{
               :foo=>10,
               :bar=>11,
               :baz=>12
              },
       :titi=>"a"
     },
  :b=>{
       :toto=>{
               :foo=>31,
               :bar=>45,
               :baz=>78
              },
       :titi=>"b"
     }
}
我的目标是将所有的
:baz
值相加。我相信在ruby中有一种很好的方法可以做到这一点。有什么想法吗

谢谢。

#inject
是一种非常强大的方法,适用于数组和散列。您可以遍历散列的值,并将所需的键求和到总和

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

此方法查找所有
: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

@prashantsharma也感谢你……)
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