18

配列ハッシュの値を合計する必要があり、ここでそれを行う方法を見つけました

しかし、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")

これは単なる希望的観測ですか、それとも私はより良い解決策を見落としていますか?

4

2 に答える 2

39

私は次のようにmap/reduceメタファーを使用するのが好きです:

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

reduceメソッドはinjectメソッドの同義語であり、injectという名前はメモコンポーネントとやや紛らわしいと思います。これには、初期値を取得するために上記で使用した別の形式と、組み合わせ/削減プロセスに使用されるメソッド呼び出しへの参照があります。

値をマッピングしてからそれらを集計に変換する全体的なパターンはよく知られており、自己文書化されていると思います。

編集:proc参照&:+の代わりにシンボル:+を使用してください

于 2013-02-01T20:54:15.320 に答える
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では定義されておらず、特定のsales配列でのみ定義されていることに注意してください。

于 2013-02-01T21:15:55.140 に答える