2010-07-13 4 views
2

문자열이나 중첩 된 해시를 인수로 취해 패스로 키패드의 평평한 버전을 반환하는 format 함수를 작성하는 방법을 찾고 있습니다.중첩 된 해시의 형식을 변경하는 방법

arg = "foo" 
format(arg) # => { "hash[keys]" => "foo" } 

arg = {:a => "foo", :b => { :c => "bar", :d => "baz" }} 
format(arg) # => { "hash[keys][a]" => "foo", "hash[keys][b][c]" => "bar", "hash[keys][b][d]" => "baz" } 
+0

나는 형식() 메소드가 인수의 이름에 액세스 할 것이라고 생각하지 않습니다. (즉, format()이'event '다음에'[actor]'를 어떻게 두는 지 어떻게 알 수 있을까요?) – sarnold

답변

1
def hash_flatten h 
    h.inject({}) do |a,(k,v)| 
    if v.is_a?(Hash) 
     hash_flatten(v).each do |sk, sv| 
     a[[k]+sk] = sv 
     end 
    else 
     k = k ? [k] : [] 
     a[k] = v 
    end 
    a 
    end 
end 

def format h 
    if h.is_a?(Hash) 
    a = hash_flatten(h).map do |k,v| 
     key = k.map{|e| "[#{e}]"}.join 
     "\"event[actor]#{key}\" => \"#{v}\"" 
    end.join(', ') 
    else 
    format({nil => h}) 
    end 
end 

arg = "sth" 
puts format(arg) 
# => "event[actor]" => "sth" 

arg = {:a => "sth", :b => { :c => "sth else", :d => "trololo" }} 
puts format(arg) 
# => "event[actor][a]" => "sth", "event[actor][b][c]" => "sth else", "event[actor][b][d]" => "trololo" 
관련 문제