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
}