1. ホーム
  2. ruby

[解決済み] Rubyで配列をハッシュに変換する最良の方法は何ですか?

2022-06-20 23:04:30

質問

Rubyで、以下のいずれかの形式の配列が与えられた場合...

[apple, 1, banana, 2]
[[apple, 1], [banana, 2]]

...これをハッシュに変換するのに最適な方法は...の形式です。

{apple => 1, banana => 2}

どのように解決するのですか?

注意 : 簡潔で効率的なソリューションのために、以下を参照してください。 Marc-André Lafortuneの回答 をご覧ください。

この回答はもともと、執筆時に最も高くupvotedされたflattenを使用するアプローチの代替案として提供されたものです。この例をベスト プラクティスや効率的なアプローチとして提示するつもりはないことを明確にする必要がありました。オリジナルの回答は以下の通りです。


警告! を用いた解決策 フラット化 を使用した場合、配列のキーや値は保持されません!

John Topleyの人気のある回答に基づいて、試してみましょう。

a3 = [ ['apple', 1], ['banana', 2], [['orange','seedless'], 3] ]
h3 = Hash[*a3.flatten]

これはエラーを投げます。

ArgumentError: odd number of arguments for Hash
        from (irb):10:in `[]'
        from (irb):10

コンストラクタは偶数長のArray(例えば ['k1','v1,'k2','v2'] )を想定していました。 さらに悪いことに、偶数長にフラット化された別の配列は、不正確な値を持つハッシュを黙って与えるだけです。

配列のキーや値を使いたい場合は マップ :

h3 = Hash[a3.map {|key, value| [key, value]}]
puts "h3: #{h3.inspect}"

これは、Arrayのキーを保持します。

h3: {["orange", "seedless"]=>3, "apple"=>1, "banana"=>2}