2017-01-04 22 views
1

私は整数のハッシュをキーとして、文字列の配列を値として持っています。これを新しいハッシュに変換する必要があります。この関係を元のハッシュ値の文字列の配列から各アイテムと逆にして、新しいハッシュのキーとなり、元の各キーが関連付けられた値になります。例:Rubyハッシュ値は配列です。文字列に変換する必要があります

original = {1 => ['a', 'b', 'c'], 2 => ['g', 'm', 'z']} 

new_hash = {'a' => 1, 'b' => 1, 'c' => 1, 'g' => 2, 'm' => 2, 'z' => 2} 

元の配列値から項目を抽出するのは難しいです。十分に簡単です

original.each { |k, v| new_hash[v] = k } 

しかし、これは元の配列を新しいキーとして保持します。私は何かをしようとしました

original.each { |k, v| new_hash[v.each { |i| i }] = k } 

しかし、これも何らかの理由で元の配列を返します。

答えて

4

もう一つに新しいキー/値のペアを割り当てるときArray#productを経由して、値の配列の各要素を反復処理する必要があります:

original.flat_map { |k, v| v.product([k]) }.to_h 
#=> {"a"=>1, "b"=>1, "c"=>1, "g"=>2, "m"=>2, "z"=>2} 
+0

すべての応答は素晴らしいですが、これは最も「ルビー」のようです。私に製品の方法を紹介してくれてありがとう。 –

2

以下のスニペットは、あなたが望むものを提供しますが、わかりやすく洗練されたソリューションを考えさせてください。

newhash = {} 

original.each do |k,v| 
    v.each do |v2| 
    newhash[v2] = k 
    end 
end 
#=> {1=>["a", "b", "c"], 2=>["g", "m", "z"]} 

newhash 
#=> {"a"=>1, "b"=>1, "c"=>1, "g"=>2, "m"=>2, "z"=>2} 
+1

'original.each_with_objectを( {}({(k、vs)、h | vs.each {| v | h [v] = k}} 'が働きます。 – Stefan

+0

私は適切な方法のドキュメントを探していました。以下のものを記憶する必要があります - )) – marmeladze

2
original.flat_map { |k, vs| vs.map { |v| {v => k} } }.reduce(&:merge) 
1

あなたのアプローチがあります。あなたはnewHash

newHash = {} 
original.each { |k, v| v.each {|i| newHash[i] = k}} 
1
original.map { |number, ary| Hash[ary.map { |char| [char, number] }] }.reduce(&:merge) 
関連する問題