Rubyのmap・select・rejectの違いとは?使い分け方をサンプルコード付きで解説

Ruby

Rubyでは配列やコレクションのデータを加工するときに、map、select、rejectというメソッドがよく使われます。どれも配列を繰り返し処理するために利用されますが、目的や返される結果には明確な違いがあります。この記事では、Ruby初心者でも理解できるようにmap・select・rejectの特徴や使い分け方を具体例とともに解説します。

Rubyのmapは要素を変換して新しい配列を作るメソッド

mapは配列の各要素に対して処理を実行し、その結果を新しい配列として返すメソッドです。元の配列の要素を別の形に変換したい場合に使用します。

例えば、数値の配列をすべて2倍にしたい場合はmapを利用します。

使用例。

numbers = [1, 2, 3, 4]
result = numbers.map { |n| n * 2 }

# 結果
# [2, 4, 6, 8]

mapでは、ブロック内で最後に評価された値が新しい配列の要素になります。そのため、要素数は基本的に元の配列と同じになります。

例えば、ユーザー一覧から名前だけを取り出したい場合などにも利用できます。

users = [
  {name: "田中", age: 25},
  {name: "佐藤", age: 30}
]

names = users.map { |user| user[:name] }

# 結果
# ["田中", "佐藤"]

Rubyのselectは条件に一致する要素だけを残すメソッド

selectは配列の中から条件に一致した要素だけを抽出するために使います。データの絞り込みを行いたい場合に便利なメソッドです。

例えば、数値の配列から偶数だけを取得する場合はselectを利用します。

numbers = [1, 2, 3, 4, 5, 6]

even_numbers = numbers.select { |n| n.even? }

# 結果
# [2, 4, 6]

selectではブロックの結果がtrueになる要素だけが新しい配列に含まれます。falseになる要素は除外されます。

実際の開発では、例えば「購入済みの商品だけ取得する」「成人ユーザーだけ取得する」といった条件検索でよく利用されます。

users = [
  {name: "田中", active: true},
  {name: "佐藤", active: false}
]

active_users = users.select { |user| user[:active] }

# 結果
# [{name: "田中", active: true}]

Rubyのrejectはselectとは逆に条件に一致する要素を除外するメソッド

rejectはselectと反対の動きをするメソッドです。指定した条件に一致する要素を取り除き、それ以外の要素だけを新しい配列として返します。

例えば、偶数を削除して奇数だけを残したい場合はrejectを使います。

numbers = [1, 2, 3, 4, 5, 6]

odd_numbers = numbers.reject { |n| n.even? }

# 結果
# [1, 3, 5]

selectで「残したい条件」を書くのに対して、rejectでは「削除したい条件」を書くため、読みやすさを考えて使い分けることが重要です。

例えば、ログインしていないユーザーを一覧から除外したい場合などはrejectを使うと意図が分かりやすくなります。

users = [
  {name: "田中", login: true},
  {name: "佐藤", login: false}
]

logged_in_users = users.reject { |user| !user[:login] }

# 結果
# [{name: "田中", login: true}]

map・select・rejectの違いを比較

メソッド 目的 結果
map 要素を変換する 元の配列と同じ数の要素
select 条件に合う要素を残す 条件に一致した要素のみ
reject 条件に合う要素を削除する 条件に一致しない要素のみ

簡単に覚えるなら、mapは「変える」、selectは「選ぶ」、rejectは「除く」と考えると分かりやすくなります。

例えば、商品データを扱う場合では、mapで商品名だけの配列を作り、selectで販売中の商品だけを取得し、rejectで在庫切れの商品を除外するといった使い方ができます。

map・select・rejectを使い分けるポイント

どのメソッドを使うか迷った場合は、まず処理後に欲しい結果を考えると判断しやすくなります。

「すべてのデータを別の形式にしたい」場合はmap、「一部だけ取り出したい」場合はselect、「不要なものを取り除きたい」場合はrejectを選びます。

例えば、以下のように考えると使い分けが簡単です。

  • 名前だけの一覧を作成する → map
  • 条件を満たすユーザーを取得する → select
  • 無効なデータを削除する → reject

まとめ|Rubyのmap・select・rejectは目的で使い分ける

Rubyのmap、select、rejectはいずれも配列処理で頻繁に使われる便利なメソッドですが、それぞれ役割が異なります。

mapはデータ変換、selectは条件による抽出、rejectは条件による除外を行うためのメソッドです。

コードを書く際は、単に動作するかだけではなく、処理の意図が伝わりやすいメソッドを選ぶことで、読みやすく保守しやすいRubyコードになります。

コメント

タイトルとURLをコピーしました