やったもん勝ち

主にプログラミングのこと。生産性向上の某とかも。

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=>"高い"}