簡體   English   中英

在ruby中的哈希哈希中求和的更簡單,更短的方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM