2014-02-12 38 views
0

如何从ruby中删除所有值。我不想删除键值。清除嵌套红宝石散列中的所有值

例如:

这里是我的散列:{'a'=>{'b'=>'c'},'d'=>'e','f'=>{'g'=>''}}

我想这一点:{'a'=>{'b'=>nil},'d'=>nil,'f'=>{'g'=>nil}}

我不想删除嵌套的哈希值。嵌套级别从一到六个级别

感谢名单

+0

递归是我认为的唯一选择。 – Candide

回答

2
h = {'a'=>{'b'=>'c'},'d'=>'e','f'=>{'g'=>''}} 

def clean_hash h 
h.each do |key, value| 
    if value.instance_of? Hash 
    clean_hash value 
    else 
    h[key] = nil 
    end 
end 
end 

clean_hash h 
#{"a"=>{"b"=>nil}, "d"=>nil, "f"=>{"g"=>nil}} 
6

变化,您可以编写自定义delete_values!方法,像这样:

class Hash 
    def delete_values! 
    each_key do |key| 
     self[key].is_a?(Hash) ? self[key].delete_values! : self[key] = nil 
    end 
    end 
end 

{'a'=>{'b'=>'c'},'d'=>'e','f'=>{'g'=>''}}.delete_values! 
# => {"a"=>{"b"=>nil}, "d"=>nil, "f"=>{"g"=>nil}} 
1
h = {'a'=>{'b'=>'c'},'d'=>'e','f'=>{'g'=>''}} 

def cleaned_hash(h) 
    h.reduce({}) do |memo, (key, val)| 
    memo[key] = if val.is_a? Hash 
        cleaned_hash(val) 
       else 
        nil 
       end 
    memo 
    end 
end 

cleaned_hash h 
# => {"a"=>{"b"=>nil}, "d"=>nil, "f"=>{"g"=>nil}} 

这不会修改散列而是给你清理副本

+2

对于一个表达式'case'是不好的做法。 –

+0

@Monk_Code谢谢,编辑。 –