我有一个嵌套的Hash:
{
:a=>{
:toto=>{
:foo=>10,
:bar=>11,
:baz=>12
},
:titi=>"a"
},
:b=>{
:toto=>{
:foo=>31,
:bar=>45,
:baz=>78
},
:titi=>"b"
}
}
我的目标是汇总所有:baz
值。我确信在红宝石中有一种漂亮的方法可以做到这一点。有什么想法吗?
感谢。
答案 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