ハッシュ.to_a / Hash[] / transform_keys / transform_values
| 対応: | Ruby 2.5(2017) |
|---|
ハッシュを配列に変換したり、キーや値を一括変換するメソッドです。『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) | ハッシュを配列に変換し、入れ子を指定深さまで展開します。 |
サンプルコード
sample_hash_to_a_transform_keys.rb
person = { name: '狡噛慎也', org: '執行官', email: 'kogami@sibyl.gov' }
# to_a:ハッシュを配列に変換
puts person.to_a.inspect
# [[:name, "狡噛慎也"], [:org, "執行官"], [:email, "kogami@sibyl.gov"]]
# 配列からハッシュを生成
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"=>"狡噛慎也", "org"=>"執行官", "email"=>"kogami@sibyl.gov"}
# 文字列キーを大文字に変換
config = { 'host' => 'localhost', 'port' => '3000' }
puts config.transform_keys(&:upcase).inspect
# {"HOST"=>"localhost", "PORT"=>"3000"}
# transform_values:全値に処理を適用
scores = { kogami: 100, tsunemori: 80, ginoza: 250 }
with_bonus = scores.transform_values { |v| (v * 1.1).round }
puts with_bonus.inspect
# {:kogami=>110, :tsunemori=>88, :ginoza=>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}
ruby hash_to_a_transform_keys.rb
[[:name, "狡噛慎也"], [:org, "執行官"], [:email, "kogami@sibyl.gov"]]
{:x=>1, :y=>2, :z=>3}
{:x=>1, :y=>2, :z=>3}
{"name"=>"狡噛慎也", "org"=>"執行官", "email"=>"kogami@sibyl.gov"}
{"HOST"=>"localhost", "PORT"=>"3000"}
{:kogami=>110, :tsunemori=>88, :ginoza=>275}
{200=>:ok, 404=>:not_found, 500=>:error}
{: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つの配列からハッシュを作る処理が簡潔に書けます。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。