2012-05-23 19 views
5

"json" hashını düzleştirilmiş bir kareye düzleştirecek, ancak yol bilgisini düzleştirilmiş tuşlarda tutacak bir yöntem arıyorum. Örneğin :Yuvalanmış bir json nesnesini düzleştirme

{"a" => "foo", "b_0_c" => "bar", "b_0_d_0" => "baz"} 
+0

"Bu ne denediniz" bu durumda gerçekten geçerli olduğunu sanmıyorum. Bu, genel bir soru ve bilgi tabanında olması yararlı. – pguardiario

+0

Belki ama eğer uygularsam, burada olmazdı. Cevabın burada olması gerektiğini düşündüm, bu yüzden sorumu yayınladım. – pguardiario

+0

Oh, sensin, OP. Üzgünüm :) –

cevap

12

Bu sorunu çözmek gerekir:

h = {"a" => "foo", "b" => [{"c" => "bar", "d" => ["baz"]}]} 

düzleştirmek (h) dönmelidir

h = {'a' => 'foo', 'b' => [{'c' => 'bar', 'd' => ['baz']}]} 

module Enumerable 
    def flatten_with_path(parent_prefix = nil) 
    res = {} 

    self.each_with_index do |elem, i| 
     if elem.is_a?(Array) 
     k, v = elem 
     else 
     k, v = i, elem 
     end 

     key = parent_prefix ? "#{parent_prefix}.#{k}" : k # assign key name for result hash 

     if v.is_a? Enumerable 
     res.merge!(v.flatten_with_path(key)) # recursive call to flatten child elements 
     else 
     res[key] = v 
     end 
    end 

    res 
    end 
end 

puts h.flatten_with_path.inspect 
+0

Çok güzel bir çözüm. – pguardiario

İlgili konular