yucatio@システムエンジニア

趣味で作ったものいろいろ

RubyでArrayをHashに変換する

前回の記事で、ArrayをHashに変換するのにArray#mapとArray#to_hを使用して、ArrayをHashに変換しました。

yucatio.hatenablog.com

オブジェクトの配列を、オブジェクトの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
}
環境