Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

group_byで配列を条件毎のハッシュに変換する

chunkは意味合い単位で区切ってEnumratorして返してくれるメソッドでした。
今回紹介するgroup_byは条件毎に振り分けてハッシュで返してくれるメソッドです。

まずは基本のtrue/false

 (1..10).map.group_by{|i| i > 2}
#=> {false=>[1, 2], true=>[3, 4, 5, 6, 7, 8, 9, 10]}

> list = [3,9]
 (1..10).map.group_by{|i| list.include?(i)}
#=> {false=>[1, 2, 4, 5, 6, 7, 8, 10], true=>[3, 9]}

剰余で場合分けもできます。

> (1..10).map.group_by{|i| i % 3}
=> {1=>[1, 4, 7, 10], 2=>[2, 5, 8], 0=>[3, 6, 9]}

ActiveRecordとも連動できるので

@list = Professor.where(id: [5,39])
##...
@list.group_by{|i| i.positon == '准教授'}[true]
  Professor Load (2.7ms)  SELECT `professors`.* FROM `professors`
#=> {false=>[#<Professor id: 5...], true=> [#<Professor id: 7, name: "田中太郎", position: "准教授",  ...>,#<Professor id: 37 ...]}