像这样哈希哈希:
d = {a: {c: 1, d:3 }, b: {c: 2, d: 6}, ...}
对c:
中的所有值进行求和的简单方法是什么?
答案 0 :(得分:3)
d.values.map { |val| val[:c] }.reduce(&:+)
解释:
d.values
=> [{:c=>1, :d=>3}, {:c=>2, :d=>6}]
d.values.map { |val| val[:c] }
=> [1, 2]
从这一点开始,您可以使用reduce(&:+)
来获得总和,或者如果您正在使用rails(或需要有效支持),您可以使用Array#sum
reduce(&:+)
是reduce { |memo, val| memo + val }
答案 1 :(得分:2)
只需查看哈希并将其:c
值相加。
d.values.sum { |h| h[:c] }
=> 3
更短(来自Sagar Pandya的评论):
d.sum { |_, v| v[:c] }
=> 3
答案 2 :(得分:1)
如果您希望允许任意深度的嵌套哈希,可以使用以下递归方法。
def sum_cees(h)
h.sum { |k,v| v.is_a?(Hash) ? sum_cees(v) : k == :c ? v : 0 }
end
sum_cees({ a: { c: 1, d:3 }, b: { d: { m: { c: 2, e: 6 } }, f: { c: 3} },
g: { c: 4 }, n: { r: 3 } })
#=> 10