2012-11-22 3 views
0

나는 중첩 된 해시가 있습니다중첩 해시 값을 어떻게 추가합니까?

hash = { 
    "a" => "a", 
    "b" => { 
    "c" => "c", 
    "d" => { 
     "e" => "e" 
    } 
    } 
} 

을 나는 해시가 : 내가 좋아하는, hash["b"]["d"]["e"]에서 해시 값을 대체합니다 "마법"기능의 일종이 필요

new_value = { 
    "b.d.e" => "new value" 
} 

을 :

magical_function(hash, new_value) 
#=> hash = { 
     "a" => "a", 
     "b" => { 
     "c" => "c", 
     "d" => { 
      "e" => "new value" 
     } 
     } 
    } 

나는 어떤 생각을 가지고 있지 않습니다. 누군가 제발 도와 드릴까요? 그것이 바로 앞으로 방식으로 구현 않다면

+0

시도해 보셨습니까? – tadman

+0

이 문제를 재귀 적으로 풀려고했지만 실패했습니다. S가 해결할 수있는 유일한 방법 일 수 있다고 생각합니다. – Max

+0

은 업데이트 (파괴적)이거나 병합 할 수 있습니까? – tokland

답변

1

는 여기에 또 다른 해결책 : hash.replace_value("b","d","e", "new_value")를 호출하여

class Hash 
    def replace_value(*keys, value) 
    current = self 
    current = current[keys.shift] while keys.size > 1 
    current[keys.last] = value 
    end 
end 

를 호출합니다.

+0

와우! 나는 당신의 해결책을 좋아한다! 짧고 멋진 + 매력처럼 작동합니다! – Max

6

은 마법이 아니다 :

merge_hash.each do |key, value| 
    parts = key.split('.') 
    leaf = parts.pop 

    target = parts.inject(hash) do |h, k| 
    h[k] ||= { } 
    end 

    target[leaf] = value 
end 
+0

+1, 멋지게 완료되었습니다. "zen-like"가 떠오른다. –

+0

이것은 훌륭한 구현 인입니다! – Max

관련 문제