2014-02-12 3 views
0

루비에서 모든 값을 제거하려면 어떻게합니까? 나는 단지 가치를 제거하고 싶지 않다. 예를 들어중첩 된 루비 해시의 모든 값 지우기

: 나는 중첩 된 해시를 삭제하지 않으 {'a'=>{'b'=>nil},'d'=>nil,'f'=>{'g'=>nil}}

:

{'a'=>{'b'=>'c'},'d'=>'e','f'=>{'g'=>''}} 내가이 원하는 : 여기

내 해시입니다.

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}} 
+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

에 따라 다릅니다 당신은 복사본을 청소했습니다

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}} 

이 줄 당신의 해시를 수정 대신하지 않습니다 중첩 수준은 당신과 같이 delete_values! 방법 사용자 정의 쓸 수 1 ~ 6 단계

고맙습니다

+2

한 표현에 대해'case'는 나쁜 습관입니다. –

+0

@Monk_Code 감사합니다. 수정되었습니다. –

관련 문제