2011-06-12 18 views
5
x = {:name => "John", :data => {:physical => {:age => 25, :weight => 150}}} 

我正在寻找将数据的子属性向上移动一层(但不一定只是简化所有属性)。在这种情况下,我基本上希望将物理属性“向上”移动一个级别。如何将红宝石散列中的属性“向上”移动一个级别

我想这

y = x[:data'] 
y.each{ |key| x[key] = y[key] } 

,但我得到...

x = x.except(:data) 
=> {:name=>"John", [:physical, {:age=>25, :weight=>150}]=>nil} 

我找...

=> {:name=>"John", :physical => {:age=>25, :weight=>150}} 

回答

7

试试这个:

x = x.merge(x.delete(:data)) 
+0

难道你不是指':data',而是':physical'吗? – matt 2011-06-12 22:11:11

+0

是的,修复了答案。 – 2011-06-12 22:12:45

+2

或['merge!'](http://ruby-doc.org/core/classes/Hash.html#M000758)以避免额外复制。 – 2011-06-12 22:41:47

2

我会追随它:

x = {:name => "John", :data => {:physical => {:age => 25, :weight => 150}}} 

x[:physical] = x.delete(:data)[:physical] 

pp x #=> {:name=>"John", :physical=>{:age=>25, :weight=>150}}