[英]easier and shorter way to sum values in a hash of hashes in ruby
散列如下:
d = {a: {c: 1, d:3 }, b: {c: 2, d: 6}, ...}
對c:
所有值求和的更簡單方法是什么?
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 }
的簡寫。 reduce { |memo, val| memo + val }
只需遍歷哈希並求和它們的:c
值即可。
d.values.sum { |h| h[:c] }
=> 3
更短(根據Sagar Pandya的評論):
d.sum { |_, v| v[:c] }
=> 3
如果您希望允許嵌套任意深度的哈希,則可以使用以下遞歸方法。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.