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

Ste*_*eO7 16 ruby ruby-on-rails

我需要在数组哈希中对值进行求和,我找到了一种在这里做的方法

但看起来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"]}
Run Code Online (Sandbox Code Playgroud)

总计行不是很可读.如果像这样的东西工作会很好;

total_sales = sales.sum("sale_price")
Run Code Online (Sandbox Code Playgroud)

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

Win*_*eld 33

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

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

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

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

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

  • 在Rails下,你可以去`sales.map {| s | S [ 'SALE_PRICE']}.sum`.如果`s`是一个带有'sale_price`方法的对象,它甚至可能更简洁:`sales.sum(&:sale_price)`:D (7认同)
  • 很好的答案.用作第二个reduce参数的`Symbol.to_proc`(`&:`)比仅写一个普通块`.reduce(0){| t,i |更慢一个数量级.t + i}`,唯一值得注意的是你的数组是否包含大量元素.见http://www.igvita.com/2008/07/08/6-optimization-tips-for-ruby-mri/#5. (3认同)