2010-07-02 42 views
1

我有这样的:红宝石:这种“双维Hash”需要处理

h = { 1 => { 1 => {:a => "x", :b => "y", :c => "z"}, 
       2 => {:a => "xx", :b => "yy", :c => "zz"} 
      }, 
     2 => { 1 => {:a => "p", :b => "q", :c => "r"}, 
       2 => {:a => "pp", :b => "qq", :c => "rr"} 
      } 
    } 

我想要得到这样的:

result = { 1 => { 1 => {:a => "x"}, 
        2 => {:a => "xx"} 
      }, 
      2 => { 1 => {:a => "p"}, 
        2 => {:a => "pp"} 
      } 
    } 

什么是这样做的一个很好的方式吗?

回答

2

一个例子不能真正定义你的结构。例如,散列总是有3级深度,散列在3级被修剪?

你可以开始:

h.each{|k1,v1| v1.each{|k2, v2| v2.delete_if{|k3,v3| k3 != :a}}} 
+0

我的散列是3层深,所以这是完美的...作品完美的我的情况...谢谢! – Garfield 2010-07-02 14:21:03

1

(实际上应该评论,但代码的难读这样)

如果你从最里面的散除删除所有钥匙:a,为什么不将该散列的值部分直接分配给包含它的散列?

result = { 
    1 => { 1 => "x", 2 => "xx"}, 
    2 => { 1 => "p", 2 => "pp"} 
} 
+0

谢谢Mike的提示。这实际上看起来好多了... – Garfield 2010-07-02 14:26:05

+0

嘿...我的实际问题与这是什么稍有不同。我使用@Mladen的答案解决了问题,并以您指定的格式得到了最终答案... :) – Garfield 2010-07-02 15:46:00