更简单,更简单的方法来在ruby中散列哈希值中的值

时间:2018-01-17 03:40:33

标签: ruby

像这样哈希哈希:

d = {a: {c: 1, d:3 }, b: {c: 2, d: 6}, ...}

c:中的所有值进行求和的简单方法是什么?

3 个答案:

答案 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