2017-07-08 2 views
-1

Ich möchte diese Teile von Code in kleinere über Rekursion konvertieren, aber ich steckte an Stelle, wo ich for Schleife verwende.Wie schreibe ich den Code rekursiv?

Ich habe das nächste Wörterbuch: var structure = []; mit der Struktur:

"path": path, 
"children": [] 

ich es bin Füllung durch meine JSON-Datei parsen. Einer der Pfade aus dem JSON sieht so aus: "path": "Assignment_1/src/com",, also analysiere ich den Pfad von / und versuche, diese Struktur innerhalb meines structure Wörterbuchs wieder aufzubauen. Der erste Teil, "path": "Assignment_1/", Ich setze mich in meine Struktur. Der zweite Teil "path": "Assignment_1/src/", Ich setze in das children Wörterbuch und so weiter.

Ohne Rekursion mache ich das:

if(path.split("/").length == 2) { 
     if(type == "tree") { 
      var path0 = path.split("/")[0]; 
      var path1 = path.split("/")[1]; 

      for(var j = 0; j < structure.length; j++) { 
       var foundPath = structure[j]["path"]; 

       if(foundPath == path0) { 
        structure[j]["children"].push({ 
         "path": path1, 
         "children": [] 
        }) 
       } 
      } 
     } 
    } 

    if(path.split("/").length == 3) { 
     if(type == "tree") { 
      var path0 = path.split("/")[0]; 
      var path1 = path.split("/")[1]; 
      var path2 = path.split("/")[2]; 

      for(var j = 0; j < structure.length; j++) { 
       var foundPath = structure[j]["path"]; 

       if(foundPath == path0) { 
        for(var k = 0; k < structure[j]["children"].length; k++) { 
         var foundPath = structure[j]["children"][k]["path"]; 

         if(foundPath == path1) { 
          structure[j]["children"][k]["children"].push({ 
           "path": path2, 
           "children": [] 
          }) 
         } 
        } 
       } 

       print(structure); 
      } 
     } 
    } 

Jetzt möchte ich es vereinigen, so wird es mein structure Wörterbuch automatisch alle Ordner durchlaufen und füllen. Ich begann mit while Loops, aber diese Teile:

structure[j]["children"].push({ }) 
structure[j]["children"][k]["children"].push({ }) 

sind Programm zu schwierig. Jede Hilfe oder Beratung hilft mir sehr!

UPDATE

Eingang ist (ein Teil):

{ 
    "path": "Folder_1/src/com", 
    "mode": "040000", 
    "type": "tree" 
}, 

Output:

enter image description here

+0

mit 'reduce' kann helfen. – OmG

+2

@ j.doe bitte Beispiel Eingabe/Ausgabe –

+0

@ Jonasw Ich habe hinzugefügt. Ich hoffe, das wird helfen. Wenn Sie etwas brauchen, fragen Sie mich bitte! –

Antwort

1
var inputs = [ 
    { 
     "path": "Folder_1/src/com", 
     "mode": "040000", 
     "type":"tree" 
    }, 
    { 
     "path": "Folder_1/src/com", 
     "mode": "040000", 
     "type":"tree" 
    }, 
    { 
     "path": "Folder_2/docs/files", 
     "mode": "040000", 
     "type":"tree" 
    } 
], 
output = []; 

inputs.forEach(function(input) { 
    parse(input.path.split('/'), output); 
}); 

function parse(input, into){ 
    var split = input, 
     first = split.shift(), 
     newItem = { 'src': first, 'children': [] };  

    if(split.length){ 
     parse(split, newItem.children); 
    } 
    if(! into.find(function(item){return item.src == first })){ 
     into.push(newItem); 
    } 
} 

console.log(output); 

Jfiddle

Obwohl ich type == tree nicht berücksichtigt habe, was auch immer das ist.

+0

danke für deine antwort! Es funktioniert, aber es schiebt einen Ordner viele Male in das Array, wie Folder1, Folder1/Kinder, Folder1/Kinder/Kinder, nicht nur das Endergebnis. Ich versuche, es jetzt zu beheben –

+0

Könnten Sie mir bitte helfen, Duplikate zu entfernen und Ordner mit dem gleichen Elternteil beizutreten? –

+0

Antwort aktualisiert :-) – James

Verwandte Themen