2016-06-22 15 views
-1

geteilt von String zu generieren habe ich ein Array von Stringsein Baum

["ana_ola_una", 
"ana_ola_ina", 
"ana_asta", 
"ana_ena_ola", 
"ana_ena_cala", 
"ana_ena_cina", 
"ana_ena_cina_ula"] 

ich es als Hash von Hashes von Hashes von umformatieren müssen ... es ist ein Baum zu machen. Das erwartete Ergebnis wäre:

{ana: 
    { 
    ola: { 
      una: {}, 
      ina: {} 
      }, 
    asta: {}, 
    ena: { 
      ola: {}, 
      cala:{}, 
      cina: 
       { 
       ula: {} 
       } 
      } 
    } 
} 

EDIT:

ich dieses Problem bearbeiten, weil ich eine ähnliche Frage habe, schließlich will ich es in einem JSON mit diesem Format. Wie könnte ich tun:

var tree = [ 
     { 
      text: "Parent 1", 
      nodes: [ 
       { 
        text: "Child 1", 
        nodes: [ 
         { 
          text: "Grandchild 1" 
         }, 
         { 
          text: "Grandchild 2" 
         } 
        ] 
       }, 
       { 
        text: "Child 2" 
       } 
      ] 
     }, 
     { 
      text: "Parent 2" 
     }, 
     { 
      text: "Parent 3" 
     }, 
     { 
      text: "Parent 4" 
     }, 
     { 
      text: "Parent 5" 
     } 
    ]; 
+1

Dies ist nicht eine Liste von Strings ist. Dies ist ein Array von Literalen. – mudasobwa

+0

Vgl. http://stackoverflow.com/questions/8404769. – sawa

+0

@mudasobwa Sorry für das schlechte Format, aber ich war nicht auf eine strenge Ruby Antwort geschlossen, ich wollte nur meine Idee als generische übersetzen. Ich bat um Hilfe für den Algorithmus, nicht für die Sprache. – jfnietom

Antwort

2
arr = %w|ana_ola_una 
    ana_ola_ina 
    ana_asta 
    ana_ena_ola 
    ana_ena_cala 
    ana_ena_cina 
    ana_ena_cina_ula| 

result = arr.each_with_object({}) do |s, memo| 
    s.split('_').inject(memo) do |deep, k| 
    deep[k.to_sym] ||= {} 
    end 
end 
+0

Vielen Dank! Das ist alles was ich brauche. – jfnietom

2

mudasobwa Antwort ist gut, aber wenn man Ruby-verwendet 2.3+ hier eine etwas prägnante Alternative ist:

arr = [ 
    "ana_ola_una", 
    "ana_ola_ina", 
    "ana_asta", 
    "ana_ena_ola", 
    "ana_ena_cala", 
    "ana_ena_cina", 
    "ana_ena_cina_ula" 
] 

tree = Hash.new {|h,k| h[k] = Hash.new(&h.default_proc) } 
arr.each {|str| tree.dig(*str.split(?_).map(&:to_sym)) } 

p tree 
# => { ana: 
#  { ola: 
#  { una: {}, 
#   ina: {} 
#  }, 
#  asta: {}, 
#  ena: 
#  { ola: {}, 
#   cala: {}, 
#   cina: { ula: {} } 
#  } 
#  } 
# }