rubyで配列、ハッシュに対する処理をするmapについてのまとめ備忘録
rubyのmapなどについて使い方をまとめてみます。
map
配列やハッシュの各値に対して同じ操作をしていく。
配列について
# 各値を2倍にする [1,2,3,4,5].map {|i| i*2}
[2, 4, 6, 8, 10]
# 何もしない [1,2,3,4,5].map{|i| i}
[1, 2, 3, 4, 5]
# 全部1にする [1,2,3,4,5].map{|i| 1}
[1, 1, 1, 1, 1]
# 偶数のときだけ2乗にしてみる(失敗) [1,2,3,4,5].map{|i| i**2 if i%2==0}
[nil, 4, nil, 8, nil]
返り値がないとnilが渡される。
# 偶数のときだけ2乗にする [1,2,3,4,5].map{|i| if i % 2 == 0 i ** 2 else i end}
[1, 4, 3, 16, 5]
# 偶数のときだけ2乗にする #1行にまとめる # ※この場合thenを省略するとエラーになる [1,2,3,4,5].map{|i| if i % 2 == 0 then i ** 2 else i end }
[1, 4, 3, 16, 5]
ハッシュについて
ハッシュに対してmapを使っても、返り値がハッシュになるわけではなく、あくまで配列を返す。
これは地味に罠。
# keyを配列にして返す { :name => "hoge", :age => "24"}.map { |key, value| key }
[:name, :age]
# valueを配列にして返す { :name => "hoge", :age => "24"}.map { |key, value| value}
["hoge", "24"]
# keyとvalueを結合した文字列を返す。 { :name => "hoge", :age => "24"}.map { |key, value| "#{key} is #{value}" }
["name is hoge", "age is 24"]
# ちなみにハッシュの書き方はこれでもいい。(というかこれが今は主流…?) { apple: 100, orange: 120, banana: 200, lemon: 250 }
{:apple=>100, :orange=>120, :banana=>200, :lemon=>250}
# valueの条件によってkeyを変更して返してみる。 { apple: 100, orange: 120, banana: 200, lemon: 250 }.map { |key, value| if value > 150 "高い" else "安い" end}
["安い", "安い", "高い", "高い"]
でもこれって、結局ハッシュに対して処理してるならハッシュで返してほしくな〜い?
というのはよくある。気がする。
to_hというのを使うらしい。なるほど〜
# 条件によってvalueを変更してハッシュで返す { apple: 100, orange: 120, banana: 200, lemon: 250 }.map {|key,value| if value > 150 [key, "高い"] else [key, "安い"] end}.to_h
{:apple=>"安い", :orange=>"安い", :banana=>"高い", :lemon=>"高い"}