Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
Enumerable.flat_map / group_by / tally
コレクションの平坦化・グルーピング・集計を行うメソッドです。データの集約処理に役立ちます。
構文
# mapの結果を1段階平坦化します。
コレクション.flat_map { |要素| 変換式 }
# ブロックの戻り値をキーにしてグループ分けします。
コレクション.group_by { |要素| キー }
# 要素の出現回数を集計したハッシュを返します。
コレクション.tally
# ネストした配列を平坦にします。
配列.flatten
配列.flatten(深さ)
メソッド一覧
| メソッド | 概要 |
|---|---|
| flat_map | 各要素にブロックを適用し、結果の配列を1段階平坦化して返します。 |
| group_by | ブロックの戻り値をキー、一致する要素の配列を値とするハッシュを返します。 |
| tally | 各要素の出現回数を集計し、『{要素 => 回数}』のハッシュを返します。 |
| flatten | ネストした配列を再帰的に平坦化します。引数で深さを制限できます。 |
サンプルコード
# flat_map でネストした配列を平坦化しながら変換します。
文章 = ["hello world", "foo bar"]
単語一覧 = 文章.flat_map { |s| s.split(" ") }
puts 単語一覧.inspect # ["hello", "world", "foo", "bar"]
# group_by で年代ごとにグループ分けします。
ユーザー = [
{ name: "田中", age: 25 },
{ name: "山田", age: 32 },
{ name: "鈴木", age: 28 },
{ name: "佐藤", age: 35 }
]
年代別 = ユーザー.group_by { |u| (u[:age] / 10) * 10 }
puts 年代別[20].map { |u| u[:name] }.inspect # ["田中", "鈴木"]
puts 年代別[30].map { |u| u[:name] }.inspect # ["山田", "佐藤"]
# tally で出現回数を集計します。
フルーツ = ["apple", "banana", "apple", "cherry", "banana", "apple"]
集計 = フルーツ.tally
puts 集計.inspect # {"apple"=>3, "banana"=>2, "cherry"=>1}
# 最も多い要素を取得します。
最多 = 集計.max_by { |_, count| count }
puts "最多: #{最多[0]}(#{最多[1]}回)" # 最多: apple(3回)
概要
『flat_map』は『map』と『flatten(1)』を組み合わせた操作を1回で行います。各要素から配列を生成してそれをまとめたい場合に便利です。『group_by』はデータを分類するときに活用でき、戻り値はハッシュです。
『tally』はRuby 2.7で追加されたメソッドで、要素の出現回数を手軽に集計できます。それ以前のバージョンでは『each_with_object』や『inject』で同等の処理を実装する必要がありました。ログ解析や投票集計など、頻度カウントが必要な場面で重宝します。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。