2017-01-04 39 views
1

我有一個整數散列作爲鍵和字符串數組作爲值。我需要將它轉換爲一個新的散列,它將原始散列值中字符串數組中每個項的關係反轉爲新散列中的鍵,並且每個原始鍵都成爲關聯值。例如:紅寶石哈希值是數組,需要轉換爲字符串

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)