如何更改嵌套哈希的格式

时间:2010-07-13 12:27:05

标签: ruby

我正在寻找一个解决方案如何编写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 个答案:

答案 0 :(得分: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"