LoginSignup
1
0

More than 3 years have passed since last update.

【Ruby】mapメソッドの使い方。オブジェクトの値を処理しハッシュやシンボルで取得する方法。

Posted at

個人メモです。

mapメソッドを使うことで、元のオブジェクトの各要素を処理した配列を取得することができる。

オブジェクト.map{|変数| 処理}
 ┗ 変数にはオブジェクトの各要素が入る
 ┗ 処理結果が配列で返る
 ┗ 非破壊処理(元のオブジェクトのそのまま)

目次

  1. rangeオブジェクトの場合
  2. 配列の場合
    1. 1次元配列
    2. 2次元配列
    3. 多次元配列
  3. オブジェクトの場合
    1. 引数が2つの場合
    2. キーを配列として取り出す
    3. 値を配列として取り出す
    4. オブジェクトの値を処理してオブジェクトとして取り出す
    5. 配列からシンボルに変換
    6. 配列からハッシュに変換
  4. オブジェクトの引数が1つの場合


rangeオブジェクトの場合

range = 1..3
range2 = range.map{|x| x*2 }

p range2   
#出力
[2, 4, 6]


配列の場合

1次元配列

1次元
arr = [1, 2, 3]
arr2 = arr.map{|x| x*2 }

p arr2   
#出力
[2, 4, 6]


2次元配列

2次元配列の場合、配列内の要素が繰り返される。

[1, 2] * 2 = [1, 2, 1, 2]

2次元
arr = [1, [2, 3]]
arr2 = arr.map{|x| x*2 }

p arr2   
#出力
[2, [2, 3, 2, 3]]


多次元配列の場合

多次元配列の場合、カッコを一つ外した要素が繰り返される。

[[1, 2]] * 2 = [[1, 2], [1, 2]]

多次元
arr =  [1, [2,3], [4, 5, [6, 7]],[[8, 9]]]
arr2 = arr.map{|x| x*2 }

p arr2   
#出力
[2, [2, 3, 2, 3], [4, 5, [6, 7], 4, 5, [6, 7]], [[8, 9], [8, 9]]]


オブジェクトの場合

オブジェクトの場合、ブロック内で指定する引数の数により取り出す要素が異なる

また、処理結果は配列で返る

変数の数 内容  取得要素の例
1 キーと値 [:a, 1]
2 第1引数:キー、 第2引数:値、 :a, 1

一般的な使い方としては、オブジェクトのキーまたは値のみを配列として取り出したい場合に使用する。(変数を2つ指定)


引数が2つの場合

引数が2つの場合、1つ目の引数にキーが、2つ目の引数に値が入る。

キーを配列として取り出す

キーのみ配列として取り出す
obj = {:a=>1, :b=>2, :c=>3}
obj2 = obj.map{|x, y| x }

p obj2
#出力
[:a, :b, :c]



▼エラー事例
キーに対しては四則演算などの処理はできない。実行するとエラーになる。

error
obj = {:a=>1, :b=>2, :c=>3}
obj2 = obj.map{|x, y| x*2 }

NoMethodError (undefined method `*' for :a:Symbol)


値を配列として取り出す

そのまま取り出す
obj = {:a=>1, :b=>2, :c=>3}
obj2 = obj.map{|x, y| y }

p obj2
#出力
[1, 2, 3]
四則演算した場合の例
obj = {:a=>1, :b=>2, :c=>3}
obj2 = obj.map{|x, y| y*2 }

p obj2
#出力
[2, 4, 6]


オブジェクトの値を処理してオブジェクトとして取り出す

オブジェクトの値を処理してオブジェクトとして取り出す方法について。

▼配列からシンボルに変換

処理結果で[キー, 処理]を作成し、
to_hメソッドでシンボルに変換する。

obj = {:a=>1, :b=>2, :c=>3}
obj2 = obj.map{|x, y| [x, y*2]}

p obj2
#出力
[[:a, 2], [:b, 4], [:c, 6]]

p obj2.to_h
#出力
{:a=>2, :b=>4, :c=>6}



▼メソッドチェーン
メソッドチェーンを使えばシンプルに記述できる。

obj = {:a=>1, :b=>2, :c=>3}
obj2 = obj.map{|x, y| [x, y*2]}.to_h

p obj2
#出力
{:a=>2, :b=>4, :c=>6}


配列からハッシュに変換

処理結果で[キー, 処理]を作成し、
to_h{|変数1, 変数2| [変数1.to_s, 処理]}でハッシュに変換する。

obj = {:a=>1, :b=>2, :c=>3}
 obj2 = obj.map{|x, y| [x, y*2]}.to_h{|v, w| [v.to_s, w]}

p obj2
#出力
{"a"=>2, "b"=>4, "c"=>6}


引数が1つの場合

引数が1つの場合、キーと値のセットを1つの要素として抜き出す。

処理をすると、KVのpairがセットで処理される。

obj = {:a=>1, :b=>2, :c=>3}
obj2 = obj.map{|x| x*2 }

p obj2   
#出力
[[:a, 1, :a, 1], [:b, 2, :b, 2], [:c, 3, :c, 3]]
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0