在哈希数组中对值进行求和的更好方法
我需要在数组哈希值中对值进行求和,我在这里找到了一种方法
但看起来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")
这只是一厢情愿的想法,还是我忽视了一个更好的解决方案?
我喜欢使用map / reduce隐喻,如下所示:
total_sales = sales.map {|s| s['sale_price']}.reduce(0, :+)
reduce方法是inject方法的同义词,我发现注入名称与memo组件有些混淆。 它有我上面使用的另一种forms来获取初始值和对用于组合/缩小过程的方法调用的引用。
我认为映射值然后将它们缩减为聚合的整体模式是众所周知的并且是自我记录的。
编辑:使用符号:+而不是proc参考&:+
你可以让它工作:
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上定义,但仅在特定sales数组上定义。