2015-09-12 2 views
3

Я пытаюсь создать древовидный из путей к файлам, которые могут быть добавлены и удалены динамически, например:Построить дерево из путей к файлам

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 

Любые мысли? Создание дерева легко, но я не могу преодолеть это дополнительное условие ... Предполагаю, что мне придется использовать какую-то рекурсию, когда я буду добавлять элементы и нарушать пути, поскольку мы обнаруживаем, что определенный путь имеет больше детей (а затем сделать то же самое рекурсивно?). Должен ли я использовать какую-то трю? Будет ли это работать, когда один и тот же путь может иметь несколько файлов? ... Спасибо!

+0

Я думаю, что вы должны построить дерево как обычно, и пусть ваш пользовательский интерфейс справится с дополнительным условием, может быть проще разбить эти требования;) – Icepickle

+0

Я не могу, к сожалению. –

ответ

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

Учитывая ваш требования, похоже, что добавление нового файла, скажем, в C, не подразумевает рекурсивных операций.

Если добавить file5.txt в папку C, вы должны преобразовать C/D в узле C, имеющей 2 детей: file5.txt и новый узел под названием D. D будут иметь те же дети, что и старый узел C/D. Затем вы можете удалить узел C/D.

Однако это не повлияет на узел A/B, так как папка A по-прежнему будет иметь только одну папку (B) в качестве дочернего элемента. Таким образом, вы можете решить проблему, производя только локальные изменения.

Смежные вопросы