建立档案路径树

问题描述:

我试图创建的文件路径,它可以添加和删除dinamically树视图,例如:建立档案路径树

A/B/C/D/file1.txt 
A/B/D/E/file2.txt 
A/B/D/G/file3.txt 
A/B/D/G/file4.txt 

我的树,然而,有一个要求,即路径没有子项目(文件)应该在一个节点中折叠。对于上面的路径会产生:

A/B 
    |---C/D 
     file1.txt 
    |---D 
    |---E 
    | file2.txt 
    |---G 
      file3.txt 
      file4.txt 

有什么想法?创建树很容易,但我无法摆脱这种额外的条件......我想我必须使用某种递归,因为我添加项目并打破路径,因为我们发现某个路径有更多的子项(然后递归地做同样的事情?)。我应该使用某种类型的trie吗?当相同的路径可以有多个文件时它工作吗?......谢谢!

+0

我认为你应该像平常一样构建树,并让你的UI处理额外的条件,这可能更容易分裂这些需求;) – Icepickle

+0

不幸的是,我不能。 –

让我们先来一个简单的解决方案来打印树,因为它实际上是:

function browseTree(node) 
{ 
    // ...print node... 

    // Visit recursively the children nodes: 
    for (var child: node.children) 
    { 
     browseTree(child); 
    } 
} 

现在,让我们修改为“缩短”单文件夹路径:

function browseTree(node) 
{ 
    // Before printing, accumulate as many straight folders as possible: 
    var nodeName=node.name 
    while (hasJustOneFolder(node)) 
    { 
     // This loop steps deeper in the tree: 
     node=node.children[0] 
     nodeName+="/"+node.name; 
    } 

    // ...print node... 

    // Last, visit recursively the non-unique children nodes: 
    for (var child: node.children) 
    { 
     browseTree(child); 
    } 
} 

function hasJustOneFolder(node) 
{ 
    return node.children.length==1 && node.children[0].isFolder(); 
} 

鉴于你要求,似乎向C中添加一个新文件并不意味着递归操作。

如果添加file5.txt到文件夹C,你必须有2名儿童C节点改造C/Dfile5.txt和一个叫D新节点。 D将与旧节点C/D具有相同的子节点。然后您可以擦除节点C/D

但是,这不会影响节点A/B,因为文件夹A仍然只有一个文件夹(B)作为子项。因此,您可以解决仅进行本地更改的问题。