在散列数组中对值进行求和的更好方法

时间:2013-02-01 20:46:58

标签: ruby-on-rails ruby

我需要对数组哈希中的值求和,我找到了一种方法here

但确实在Ruby中应该有更优雅的方式。

这是有效的;

sales = [{"sale_price"=>210000, "deed_type"=>"Warranty Deed"}, {"sale_price"=>268300, "deed_type"=>"Warranty Deed Joint"}]

total_sales = sales.inject(0) {|sum, hash| sum + hash["sale_price"]}

总计行不是很易读。如果这样的事情奏效会很好;

total_sales = sales.sum("sale_price")

这只是一厢情愿的想法还是我忽视了一个更好的解决方案?

2 个答案:

答案 0 :(得分:29)

我喜欢使用map / reduce隐喻,如下所示:

total_sales = sales.map {|s| s['sale_price']}.reduce(0, :+)

reduce方法是inject方法的同义词,我发现注入名称与memo组件有些混淆。它有我上面使用的另一种形式来获取初始值和对用于组合/缩小过程的方法调用的引用。

我认为映射值然后将它们缩减为聚合的整体模式是众所周知的并且是自我记录的。

编辑:使用符号:+而不是proc参考&:+

答案 1 :(得分:4)

你可以让它发挥作用:

sales = [{"sale_price"=>210000, "deed_type"=>"Warranty Deed"}, {"sale_price"=>268300, "deed_type"=>"Warranty Deed Joint"}]

def sales.sum(by)
  inject(0){|sum, h| sum + h[by]}
end

p sales.sum("sale_price") #=> 478300

请注意,此sum方法(sum_by可能是更好的名称)未在Array上定义,但仅在特定销售数组上定义。