tags:

views:

49

answers:

1

I would like to parse data and get in output:

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

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

How to do that?

+2  A: 
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"
Mladen Jablanović