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

Я не думаю, что метод формат() будет иметь доступ к имени вашего аргумента. (Другими словами, как формат() знал бы разместить '[actor]' after' event'?) – 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" 
Смежные вопросы