2017-07-08 100 views
-1

我想通过递归将这些代码块转换成更小的代码块,但是我卡住了我正在使用for循环的地方。如何递归编写代码?

我的下一个词典:var structure = [];结构为:

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

我通过我的解析JSON文件填充它。其中一条来自JSON的路径如下所示:"path": "Assignment_1/src/com",,所以我正在解析路径/,并试图在我的structure字典中重建此结构。第一部分,"path": "Assignment_1/",我正在放入我的结构中。第二部分"path": "Assignment_1/src/",我把里面的children字典等等。

没有递归我这样做:

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); 
      } 
     } 
    } 

现在我想统一它,所以它会自动通过所有文件夹和填补我structure字典。我开始与while循环,但这部分:

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

太难程序。任何帮助或建议将帮助我很多!

UPDATE

输入是(一个部分):

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

输出:

enter image description here

+0

使用'reduce'可以提供帮助。 – OmG

+2

@ j.doe请提供示例输入/输出 –

+0

@Jonasw我已添加。我希望这会有所帮助。如果你需要什么,请问我,请! –

回答

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

虽然我没有考虑到type == tree,无论如何。

+0

感谢您的回答!它可以工作,但它会多次将一个文件夹放到数组中,如Folder1,Folder1/Children,Folder1/children/children,而不仅仅是最终结果。我正在尝试修复它 –

+0

你能帮我删除重复项,并加入同一个父文件夹吗? –

+0

回答更新:-) – James