2010-11-12 137 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