mapによる配列の操作
配列を操作する方法として、eachメソッド以外にmapメソッドを使う方法がある。
以下の例のように、配列の各値に5ずつ足すとき、eachメソッドでは空の配列を用意してからその配列に追加するが、mapメソッドでは新しい配列にそのまま代入できるため、eachメソッドに比べより簡潔に書くことができる。
また、元の配列を直接更新することも可能。
sample_01.rb
scores = [70, 90, 80]
# eachの場合
updated_scores_01 = []
scores.each do |score|
updated_scores_01 << score + 5
end
p updated_scores_01
# 出力:[75, 95, 85]
# mapの場合
updated_scores_02 = scores.map do |score|
score + 5
end
p updated_scores_02
# 出力:[75, 95, 85]
# 元のデータを直接更新
scores.map! do |score|
score + 5
end
p scores
# 出力:[75, 95, 85]
元データ直接更新の場合、メソッド名の後の!が必須となる。
filterによる配列の操作
配列の中から条件に合致する値のみ取り出す場合、eachメソッドだけでなく、filterも使える。
sample_02.rb
scores = [70, 90, 80, 65, 85, 77]
# eachの場合
pass_score_01 = []
scores.each do |score|
if score >= 80
pass_score_01 << score
end
end
p pass_score_01
# 出力:[90, 80, 85]
# mapの場合(使えない?)
# pass_score_02 = scores.each do |score|
# if score >= 80
# pass_score_02 << score
# end
# end
# p pass_score_02
# ※※※ エラーとなる ※※※
# filterの場合
filterd_scores = scores.filter do |score|
score >= 80
end
p filterd_scores
# 出力:[90, 80, 85]
# 元データの直接更新
scores.filter! do |score|
score >= 80
end
p scores
# 出力:[90, 80, 85]