📝

Ruby mapメソッドの応用的な使い方

2023/06/26に公開

昨日もまとめたmapメソッドについて、今日は応用的な使い方の例を紹介します。

splitメソッドと併用して、分割した配列の要素を文字列から数値に変換する

これはカンマ区切りや空白で区切られた数字の文字列を数値に変換した配列が欲しいなぁという時に使えます。
例えば、"1,23,4,567,8,9,10"というカンマで区切られた文字列があったとき、これをsplitメソッドで配列の変換するだけでは各要素は文字列(string)のままです。
splitメソッドにmapメソッドを併用してあげれば、数字(integer)の配列で取得できます。

# splitメソッドで区切り文字をカンマに指定して配列に変換
irb(main):002:0> array = "1,23,4,567,8,9,10".split(',')
=> ["1", "23", "4", "567", "8", "9", "10"]

# 型を確認してみると…
irb(main):003:0> array[0].class
=> String

# splitメソッド + mapメソッドで数字へ変更して配列で取得
irb(main):004:0> array = "1,23,4,567,8,9,10".split(',').map(&:to_i)
=> [1, 23, 4, 567, 8, 9, 10]

irb(main):005:0> array[0].class
=> Integer

データベースから特定の値だけ配列にする

Railsでもmapメソッドは大活躍します。
例えば、usersテーブルの全レコードから全ユーザーの年齢だけ取得する、みたいな使い方ができます。

users = User.all
ages = users.map { |user| user.age }
p ages  # [9, 11, 23, 45, 66, 12, 77]

mapメソッド内にメソッドを使用する

mapメソッドはブロック内でメソッドを使用することで、もっと使い方に幅が広がります。

# 引数に渡された値が20以上だったら引数の値をそのまま返すメソッド
def filter_r20(age)
  age if age >= 20
end

# 上記のメソッドをmapメソッド内で使用する
ages = [9, 11, 23, 45, 66, 12, 77]
filtered_r20_array = ages.map { |age| filter_r20(age) }
p filtered_r20_array  # [nil, nil, 23, 45, 66, nil, 77]

参考

今回もこちらのページを参考にまとめさせてもらいました。

https://pikawaka.com/ruby/map#データベースから特定の値だけ配列にする方法

https://pikawaka.com/ruby/split#mapメソッドと組み合わせる

Discussion