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]