グループ
こんなデータがあるとして、
[ { name: "筒香", bats: 5, hits: 3 }, { name: "ロペス", bats: 5, hits: 2 }, { name: "宮崎", bats: 5, hits: 4 }, { name: "筒香", bats: 4, hits: 2 }, { name: "ロペス", bats: 4, hits: 4 }, { name: "宮崎", bats: 4, hits: 4 }, ]
こんな結果が欲しいとき
[ {:name=>"宮崎", :bats=>9, :hits=>8}, {:name=>"ロペス", :bats=>9, :hits=>6}, {:name=>"筒香", :bats=>9, :hits=>5}, ]
rubyでこんな風に書いた
records = [ { name: "筒香", bats: 5, hits: 3 }, { name: "ロペス", bats: 5, hits: 2 }, { name: "宮崎", bats: 5, hits: 4 }, { name: "筒香", bats: 4, hits: 2 }, { name: "ロペス", bats: 4, hits: 4 }, { name: "宮崎", bats: 4, hits: 4 }, ] ans = records.each_with_object([]) do |item, memo| if ev = memo.detect{ |ev| item[:name] == ev[:name] } ev.merge!(item.merge(bats: item[:bats] + ev[:bats], hits: item[:hits] + ev[:hits])) else memo << item.dup end end .sort_by{|h| -h[:hits] } p ans # [ # {:name=>"宮崎", :bats=>9, :hits=>8}, # {:name=>"ロペス", :bats=>9, :hits=>6}, # {:name=>"筒香", :bats=>9, :hits=>5} # ]
SQLのほうがシンプルに書ける。
# create table create table bayrecord ( name varchar(20), bats int, hits int ); # insert data insert into bayrecord values ('筒香', 5, 3); insert into bayrecord values ('ロペス', 5, 2); insert into bayrecord values ('宮崎', 5, 4); insert into bayrecord values ('筒香', 4, 2); insert into bayrecord values ('ロペス', 4, 4); insert into bayrecord values ('宮崎', 4, 4); # select select name, sum(bats), sum(hits) from bayrecord group by name order by sum(hits) desc;