すべての回答は、開始配列が一意であることを前提としています。OPは重複したエントリを持つ配列の処理方法を指定しなかったため、重複したキーになります。
を見ようよ:
a = ["item 1", "item 2", "item 3", "item 4", "item 1", "item 5"]
item 1 => item 2
上書きされるため、ペアは失われますitem 1 => item 5
。
Hash[*a]
=> {"item 1"=>"item 5", "item 3"=>"item 4"}
を含むすべてのメソッド reduce(&:merge!)
同じ削除の結果。
しかし、これはまさにあなたが期待していることかもしれません。しかし、他の場合では、Array
代わりにfor値を使用して結果を取得したい場合があります。
{"item 1"=>["item 2", "item 5"], "item 3"=>["item 4"]}
単純な方法は、ヘルパー変数、デフォルト値を持つハッシュを作成し、それをループで埋めることです。
result = Hash.new {|hash, k| hash[k] = [] } # Hash.new with block defines unique defaults.
a.each_slice(2) {|k,v| result[k] << v }
a
=> {"item 1"=>["item 2", "item 5"], "item 3"=>["item 4"]}
上記を1行で使用assoc
しreduce
て実行することは可能ですが、それを推論して読むのははるかに難しくなります。
*
呼び出されたスプラットの演算子。これは配列を取り、それを項目のリテラルリストに変換します。つまり*[1,2,3,4]
=>1, 2, 3, 4
です。この例では、上記はを実行することと同じHash["item 1", "item 2", "item 3", "item 4"]
です。そしてHash
持っている[]
(でも、インデックスキーと奇数のインデックス値を作る)引数のリストを受け取るメソッドを、しかし、Hash[]
我々が使用してアレイをスプラットので、配列を受け付けません*
。