2010-11-12 225 views
5

我有以下紅寶石哈希:紅寶石哈希轉

h = { i1: { q1: 1, q2:2 }, i2: { q1: 3, q2: 4} } 

,我要轉,如下所示:

{ q1: { i1: 1, i2: 3 }, q2: { i1: 2, i2: 4 } } 

現在,我想出了我想要做什麼的功能, 但我不知道是否有一個更簡潔/優雅的方式爲同一件事?

我的解決辦法:

ht = Hash.new{ |h,k| h[k] = {} } 

h.each_pair do |k,ih| 
    ih.each_pair{ |ik, iv| ht[ik][k] = iv } 
end 
+0

這已經是非常succint。你有沒有一個真實世界的例子,當你想改變這樣的散列? – 2010-11-12 10:26:07

+0

我有基本相同的數據結構(只是更大)與指標(i1,i2,...)和它們在某些日期(q1,q2,q3,...)的值。我仍然不確定天氣我應該在這裏使用二維數組(而實際上我仍然在評估兩個版本......) – 2010-11-13 09:43:53

+0

如果你經常做這種雜耍,你可能會發現使用Sqlite更容易。 – 2010-11-15 08:08:42

回答

2

如果你喜歡inject,你可以把它寫成

h.inject({}){|a,(k,v)| 
    v.inject(a){|a1,(k1,v1)| 
    a1[k1] ||= {} 
    a1[k1][k] = v1 
    a1 
    } 
    a 
} 
+0

是的,它和注入一樣,儘管我認爲第一種方式可以更好地讀取(在真正的函數中,我必須包括更多的代碼行,例如異常處理等) – 2010-11-13 10:00:04

+0

您是否使用過這個代碼塊上的一種縮小庫?它看起來醜陋:) – scaryguy 2016-10-12 09:26:51