Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Ruby辞典

  1. トップページ
  2. Ruby辞典
  3. ハッシュ.to_a / Hash[] / transform_keys / transform_values

ハッシュ.to_a / Hash[] / transform_keys / transform_values

ハッシュを配列に変換したり、キーや値を一括変換するメソッドです。『transform_keys』『transform_values』を使うと、ハッシュの構造を保ったまま全キー・全値を変換できます。

構文
# ハッシュを [キー, 値] の配列の配列に変換します。
ハッシュ.to_a

# 配列からハッシュを生成します。
Hash[配列]
配列.to_h

# すべてのキーをブロックで変換した新しいハッシュを返します。
ハッシュ.transform_keys { |キー| 新しいキー }

# すべての値をブロックで変換した新しいハッシュを返します。
ハッシュ.transform_values { |値| 新しい値 }
メソッド一覧
メソッド概要
to_aハッシュを『[[キー, 値], ...]』形式の配列に変換します。
Hash[array]『[[キー, 値], ...]』形式の配列からハッシュを生成します。
to_h { |k, v| ... }配列からハッシュを生成します。ブロックで変換ロジックを指定できます(Ruby 2.6以降)。
transform_keys { |k| ... }すべてのキーを変換した新しいハッシュを返します(Ruby 2.5以降)。
transform_keys! { |k| ... }元のハッシュのキーを変換します(破壊的)。
transform_values { |v| ... }すべての値を変換した新しいハッシュを返します(Ruby 2.4以降)。
transform_values! { |v| ... }元のハッシュの値を変換します(破壊的)。
invertキーと値を入れ替えた新しいハッシュを返します。
flatten(depth)ハッシュを配列に変換し、入れ子を指定深さまで展開します。
サンプルコード
person = { name: '太郎', age: 30, city: '東京' }

# to_a:ハッシュを配列に変換
puts person.to_a.inspect
# [[:name, "太郎"], [:age, 30], [:city, "東京"]]

# 配列からハッシュを生成
pairs = [[:x, 1], [:y, 2], [:z, 3]]
puts Hash[pairs].inspect       # {:x=>1, :y=>2, :z=>3}
puts pairs.to_h.inspect        # {:x=>1, :y=>2, :z=>3}(Ruby 2.0以降)

# transform_keys:シンボルキーを文字列に変換
string_keys = person.transform_keys(&:to_s)
puts string_keys.inspect
# {"name"=>"太郎", "age"=>30, "city"=>"東京"}

# 文字列キーを大文字に変換
config = { 'host' => 'localhost', 'port' => '3000' }
puts config.transform_keys(&:upcase).inspect
# {"HOST"=>"localhost", "PORT"=>"3000"}

# transform_values:全値に処理を適用
prices = { apple: 100, orange: 80, grape: 250 }
with_tax = prices.transform_values { |v| (v * 1.1).round }
puts with_tax.inspect
# {:apple=>110, :orange=>88, :grape=>275}

# invert:キーと値を入れ替え
code_map = { ok: 200, not_found: 404, error: 500 }
puts code_map.invert.inspect
# {200=>:ok, 404=>:not_found, 500=>:error}

# zip + to_h:2つの配列からハッシュを生成
keys   = [:a, :b, :c]
values = [1, 2, 3]
puts keys.zip(values).to_h.inspect  # {:a=>1, :b=>2, :c=>3}
概要

『transform_keys』と『transform_values』はRuby 2.4〜2.5で追加されました。以前は『map { }.to_h』で代替していましたが、これらのメソッドを使う方が意図が明確で読みやすいコードになります。

JSONなどの外部データはキーが文字列になっていることが多いため、シンボルに変換する際に『transform_keys(&:to_sym)』がよく使われます。『invert』はキーと値を入れ替えますが、値が重複していると後で処理されたキーが残り、一部のキーが失われる可能性があります。値の一意性を確認してから使いましょう。

『to_h』にブロックを渡すことでマッピングを同時に行えます(例:『array.to_h { |e| [e, e.upcase] }』)。zipと組み合わせると、並行する2つの配列からハッシュを作る処理が簡潔に書けます。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。