Как изменить формат вложенных хэшей - PullRequest
2 голосов
/ 13 июля 2010

Я ищу решение, как написать функцию 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" }

1 Ответ

1 голос
/ 13 июля 2010
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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...