Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Ruby辞典

  1. トップページ
  2. Ruby辞典
  3. ハッシュ.each / map / select / reject

ハッシュ.each / map / select / reject

ハッシュの各ペアを繰り返し処理したり、変換・抽出するメソッドです。配列と同様に『each』『map』『select』『reject』が使えますが、ブロック変数がキーと値の2つになります。

構文
# キーと値のペアを繰り返し処理します。
ハッシュ.each { |キー, 値| 処理 }
ハッシュ.each_pair { |キー, 値| 処理 }

# 各ペアを変換した配列を返します。
ハッシュ.map { |キー, 値| 変換後の値 }

# 条件を満たすペアだけを含むハッシュを返します。
ハッシュ.select { |キー, 値| 条件 }
ハッシュ.filter { |キー, 値| 条件 }   # select の別名

# 条件を満たすペアを取り除いたハッシュを返します。
ハッシュ.reject { |キー, 値| 条件 }
メソッド一覧
メソッド概要
each { |k, v| ... }キーと値のペアを順番に繰り返します。戻り値は元のハッシュです。
each_pair { |k, v| ... }『each』の別名です。
each_key { |k| ... }キーだけを繰り返します。
each_value { |v| ... }値だけを繰り返します。
map { |k, v| ... }各ペアをブロックで変換した結果の配列を返します。
select { |k, v| ... }ブロックが『true』を返すペアだけを含む新しいハッシュを返します。
reject { |k, v| ... }ブロックが『true』を返すペアを取り除いた新しいハッシュを返します。
count { |k, v| ... }条件を満たすペアの数を返します。引数なしの場合は全ペア数。
any? { |k, v| ... }条件を満たすペアが1つでもあれば『true』を返します。
all? { |k, v| ... }すべてのペアが条件を満たす場合に『true』を返します。
サンプルコード
scores = { 太郎: 85, 花子: 92, 次郎: 68, 三郎: 77 }

# each:キーと値を順番に出力
scores.each { |name, score| puts "#{name}: #{score}点" }

# each_key / each_value
scores.each_key   { |k| print "#{k} " }    # 太郎 花子 次郎 三郎
puts
scores.each_value { |v| print "#{v} " }    # 85 92 68 77
puts

# map:全スコアに10点加算した配列
boosted = scores.map { |name, score| [name, score + 10] }.to_h
puts boosted.inspect
# {:太郎=>95, :花子=>102, :次郎=>78, :三郎=>87}

# select:80点以上の生徒だけ抽出
passed = scores.select { |_, score| score >= 80 }
puts passed.inspect
# {:太郎=>85, :花子=>92}

# reject:低スコアを除外(selectの逆)
not_low = scores.reject { |_, score| score < 75 }
puts not_low.inspect
# {:太郎=>85, :花子=>92, :三郎=>77}

# count / any? / all?
puts scores.count { |_, s| s >= 80 }   # 2(合格者数)
puts scores.any?  { |_, s| s >= 90 }   # true(90点以上がいるか)
puts scores.all?  { |_, s| s >= 60 }   # true(全員60点以上か)
概要

ハッシュに対して使う『each』『map』『select』は、配列と同様の使い心地ですが、ブロック変数がキーと値の2つになる点が異なります。ブロック変数を1つにすると、キーと値が2要素の配列として渡されます。

『map』はハッシュに対して使うと配列を返します。ハッシュのまま変換結果を受け取りたい場合は、末尾に『to_h』または『each_with_object({})』パターンを組み合わせる必要があります。Ruby 2.6以降ではtransform_values / transform_keysを使う方がより直感的です。

特定のキーが不要な場合はブロック変数に『_』(アンダースコア)を使うのが慣習です(例:『reject { |_, score| score < 75 }』)。これにより「このブロック変数は使わない」という意図が明確になります。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。