RubyでArrayをHashに変換する
前回の記事で、ArrayをHashに変換するのにArray#mapとArray#to_hを使用して、ArrayをHashに変換しました。
オブジェクトの配列を、オブジェクトのIDをハッシュのキー、オブジェクト自身をハッシュのバリューとして登録したい場合があります。
例として、配列のデータをハッシュに変換します。idをキーとして、データ自体を値としたHashを作成するには下記で実現できます。
arr = [ {id: 1, name: "Alice", age: 20}, {id: 2, name: "Bob", age: 30} ] arr.map {|data| [data[:id], data]}.to_h # => # { # 1=>{:id=>1, :name=>"Alice", :age=>20}, # 2=>{:id=>2, :name=>"Bob", :age=>30} # }
順を追って見ていきます。まずmapオブジェクトで、配列の各要素を、[data[id], data]に変換します。
arr.map {|data| [data[:id], data]} # => # [ # [1, {:id=>1, :name=>"Alice", :age=>20}], # [2, {:id=>2, :name=>"Bob", :age=>30}] # ]
これを、to_hを使用してハッシュに変換します。
[[1, {:id=>1, :name=>"Alice", :age=>20}], [2, {:id=>2, :name=>"Bob", :age=>30}]].to_h # => # { # 1=>{:id=>1, :name=>"Alice", :age=>20}, # 2=>{:id=>2, :name=>"Bob", :age=>30} # }
to_hの方法を知る前は以下のように書いていましたが、to_hの方がすっきり書けるように思います。
obj_hash = {} arr.each { |data| obj_hash[data[:id]] = data }