Rubyのeach、map、selectで配列操作

【バージョン情報】
Windows7,10Pro
Ruby2.4.x

eachはわかるね?

array = [
"apple",
"banana",
"orange",
]
array.each do |ele|
puts ele.upcase
end
#全部大文字で表示されるね。

mapとselectによる配列操作

どちらも配列操作には便利ですね。

map

「元の配列を利用して、新しい配列を返すときに使える。」
「大文字にした新しい配列を作りたい!」

こういう処理ってよくあるね。
元の配列を利用して、それを加工した新しい配列を作りたい!ってこと。

【eachだと?】
空配列、例えばnew_arrayを作って、eachで回しながら、「<<」で要素を追加するやり方。

【mapだと直でそのまま新配列を作成できる!】

array = [
"apple",
"banana",
"orange",
]
new_array = array.map do |ele|
ele.upcase
end

puts "元配列:#{array}"
#「#{}」で配列展開すると1行出力できる

puts "新配列が#{new_array}"
#直接表示する場合
p array.map { |ele| ele.upcase }

select

条件にtrueなものだけ配列の要素として返す。
だからブロックに条件式を書くことになります。

ifに似てるね。条件式を書いて、trueのものだけ返してくる。

array = [
"apple",
"banana",
"orange",
"pain",
"grape",
]
p array.select { |ele| ele.match(/p/) }
#trueにしたい条件は「p」を含んでいること
#do~endを使い、なおかつ「select_array」に代入する場合
select_array = array.select do |ele|
ele.match(/p/)
end
puts select_array

#元の配列は相変わらず
puts array

selectの反転メソッドに「reject」があるけど…。
私は頭が弱いので、反転するメソッドは混乱する。自分の頭はプログラマー向けではないようです。(悲笑)
他にもuntilやunlessが苦手です。(悲笑)
プログラマー脳になりたい!(悲願)

#「p」が入っていないもの抽出
array = [
"apple",
"banana",
"orange",
"pain",
"grape",
]
p array.reject { |ele| ele.match(/p/) }

ちなみに「!」で条件を反転させたら同じ意味。
自分はこっちを使います。

p array.reject { |ele| !ele.match(/p/) }

参考書とか見ると「ueless、until、rejectなどをちゃんと使いましょう!」ってよく見ます。みなさんはできるだけ使えたら使ってください。

「map」と「map!」の違い(selectも)

「!」は破壊的メソッド。元の配列を変えてしまいます。

比較

【map】

#元arrayは変わらない
array = ["apple","banana","orange","pain","grape",]
p array.map { |ele| ele.upcase }
p array

【map!】

#元arrayも大文字かしてしまう(x_x)
array = ["apple","banana","orange","pain","grape",]
p array.map! {|ele| ele.upcase}
p array

【select】

#これは前述のselectコード例
array = ["apple","banana","orange","pain","grape",]
p array.select { |ele| ele.match(/p/) }
p array

【select!】

#元arrayに「.select」を使うと元arrayの要素が減ります
array = ["apple","banana","orange","pain","grape",]
p array.select! { |ele| ele.match(/p/) }
p array

「!」ビックリマーク使うだけで挙動が変わってしまうなんてびっくりだね!

スポンサーリンク
投稿記事
スポンサーリンク
OKE2GOU