2015-04-24 98 views
0

我想獲得一個哈希值,其中有一個數值反轉的數組,這樣的鍵就是現在的值。從這樣的表達式:反轉哈希:從一個數組中創建多個哈希鍵

StackOverflow.transform({ 1 => ['A', 'E'] , 2 => ["B"]}) 

我想要得到這樣的結果:

{"A"=>1, "E"=>1, "B"=>2} 

我有這樣的:

class StackOverflow 
    def self.transform(old) 
    a = Hash[old.map { |k,v| v.product([k]) }.first] 
    end 
end 

但按鍵都分開,單獨密鑰(未分組)。它返回:

{"A"=>1, "E"=>1} 

我也試圖downcase的鑰匙,但我覺得我以後正確地找出這種倒掛的問題,我就可以(希望?)弄不清downcasing邏輯以及。

+0

我喜歡@標誌的使用'flat_map'的,但另一種選擇是,以取代'first'用'壓平(1)'。 –

+0

這是一個http://stackoverflow.com/questions/7513730/hash-invert-in-ruby的重複,儘管它可能值得離開,因爲@MarkThomas比我在前面的問題中看到的有更好的答案嗎? – Sid

+0

這與@Sid非常相似,但不幸的是,我無法找到對我來說合情合理的好答案。謝謝你把它留下。不幸的是我得到了一個投票(可能是因爲這個) - 但我向人們保證,在發佈問題之前儘可能合理地搜索StackO。 –

回答

4

你非常接近。您想要使用flat_map而不是first

class StackOverflow 
    def self.transform(old) 
    Hash[old.flat_map { |k,v| v.product([k]) }] 
    end 
end 

您正在使用first來壓扁數組。

0

另一種方式:

class StackOverflow 
    def self.transform(old) 
    val = nil 
    old.each_with_object(Hash.new { |h,k| h[k]=val }) do |(k,v),h| 
     val = k 
     h.values_at(*v) 
    end 
    end 
end 

old = { 1=>['A', 'E'], 2=>['B'] } 
StackOverflow.transform(old) 
    #=> {"A"=>1, "E"=>1, "B"=>2}