【Ruby】mapメソッドを使って配列から新しい配列を作成する

Ruby

本記事では、Rubyのmapメソッドの基本的な書き方と具体的な使い方をコード例を用いて解説します。

Rubyのmapメソッド・map!メソッドとは

Rubyのmapメソッドとmap!メソッドは、配列に対して使用できるメソッドであり、配列の要素の数だけ繰り返し処理を行い、処理後の戻り値で新しい配列を作成することが可能です。

新しい配列 = 配列.map do |element|
  # 処理
end

# もしくは

新しい配列 = 配列.map{ |element|
  # 処理
}

map!メソッドも上記と同じ公文で使用します。

補足:mapとmap!の違いとは

Rubyのmapメソッドとmap!メソッドは、配列から新しい配列を作成するという処理に関しては同じ動作をします。

しかし、

  • map:非破壊的メソッド
  • map!:破壊的メソッド

という決定的な違いがあります。

つまり、mapメソッドは処理後、元の配列は何も変化がないのに対し、map!メソッドを使用すると元の配列も新しい配列に置き換わってしまうということです。

【mapメソッドの場合】

array = [10, 20, 30]
new_array = array.map{ |number| number + 5 }

# array => [10, 20, 30]となり元の配列はそのまま残る
# new_array => [15, 25, 35]

【map!メソッドの場合】

array = [10, 20, 30]
new_array = array.map{ |number| number + 5 }

# array => [15, 25, 35]となり元の配列は無くなる
# new_array => [15, 25, 35]

Rubyのmapを使用した具体的なコード例

以下の3つのケースを仮定して、mapメソッドの具体的な使い方について見ていきましょう。

  • 配列内の数値を全て2倍にする
  • 配列内の文字列要素の文字数で新しい配列を作る
  • 配列内のハッシュを利用して、フルネームが格納された配列を作る

それぞれ順に解説しますね。

配列内の数値を全て2倍にする

mapメソッドを使用して、配列内の数値を2倍にする場合、mapのブロック内で各要素を2倍にするよう記述します。

numbers = [100, 150, 200, 250, 300]
new_numbers = numbers.map{ |number| number * 2 }

# numbers => [100, 150, 200, 250, 300]
# new_numbers = [200, 300, 400, 500, 600]

なお、map!メソッドを使用すると、元の配列であるnumbersも2倍に書き換えられます。

numbers = [100, 150, 200, 250, 300]
new_numbers = numbers.map!{ |number| number * 2 }

# numbers => [200, 300, 400, 500, 600]
# new_numbers = [200, 300, 400, 500, 600]

配列内の文字列要素の文字数で新しい配列を作成する

配列内にある各文字列の文字数を取得して、それらの文字数で新しい配列を作成するには、mapメソッドのブロック内で文字列を取得するためのlengthプロパティを使用します。

names = ["ogino", "fujiwara", "nakamura","yasuda"]
name_length_array = names.map{ |name| name.length }

# names => ["ogino", "fujiwara", "nakamura","yasuda"]
# name_length_array => [5, 8, 8, 6]

map!メソッドを使用した場合の挙動はこの通りです。

names = ["ogino", "fujiwara", "nakamura","yasuda"]
name_length_array = names.map!{ |name| name.length }

# names => [5, 8, 8, 6]
# name_length_array => [5, 8, 8, 6]

配列内のハッシュを使用して、フルネームが格納された配列を作成する

まず、前提として以下のように、苗字と名前が格納されたハッシュ(連想配列)が配列内にあるとします。

persons = [
  {first_name: "貴司", last_name: "荻野"},
  {first_name: "大海", last_name: "岡"},
  {first_name: "朗希", last_name: "佐々木"}
]

上記の(配列の中にある)ハッシュのfirst_nameとlast_nameを組み合わせてフルネームを作成し、フルネームの文字列だけで新しく配列を作るとしたら、以下のように記述します。

full_names = persons.map{ |person_hash|
  person_hash[:last_name] + person_hash[:first_name]
}

# persons => [{:first_name=> "貴司", :last_name=> "荻野"}, {:first_name=> "大海", :last_name=> "岡"}, {:first_name=> "朗希", :last_name=> "佐々木"}]
# full_names => ["荻野貴司", "岡大海", "佐々木朗希"]

ちなみに、map!を使用すると次のようになります。

full_names = persons.map!{ |person_hash|
  person_hash[:last_name] + person_hash[:first_name]
}

# persons => ["荻野貴司", "岡大海", "佐々木朗希"]
# full_names => ["荻野貴司", "岡大海", "佐々木朗希"]
タイトルとURLをコピーしました