2017-07-13 4 views
0

J'ai une liste de chemins de répertoires. Je veux convertir cela en une hiérarchie.Chemin du répertoire plat vers la hiérarchie

Format d'entrée:

var paths = [ 
    "A/B", 
    "A/B/C", 
    "A/B/C/D", 
    "A/B/C/E", 
    "F" 
]; 

Format de sortie

[ 
    { 
    "name": "A", 
    "children": [ 
     { 
     "name": "B", 
     "children": [ 
      { 
      "name": "C", 
      "children": [ 
       { 
       "name": "D", 
       "children": [] 
       }, 
       { 
       "name": "E", 
       "children": [] 
       } 
      ] 
      } 
     ] 
     } 
    ] 
    }, 
    { 
    "name": "F", 
    "children": [] 
    } 
] 

Dans mon entrée, je ne peux avoir aucun paramètre parent. Mon violon en cours est ici - https://jsfiddle.net/ashwyn/Laamg14z/2/

Merci.

+0

_ "Je suis une contrainte de temps" _ - ce ne sera pas vous aider à obtenir des réponses plus rapides. Au lieu de mettre tout votre code pertinent dans votre question en utilisant un [mcve] volonté. – evolutionxbox

Répondre

1

var paths = [ 
 
    "A/B", 
 
    "A/B/C", 
 
    "A/B/C/D", 
 
    "A/B/C/E", 
 
\t "F" 
 
]; 
 

 
/* Output 
 
[{"name":"A","children":[{"name":"B","children":[{"name":"C","children":[{"name":"D","children":[]},{"name":"E","children":[]}]}]}]},{"name":"F","children":[]}] 
 
*/ 
 

 
console.log(convertToHierarchy(paths).children) 
 

 
function convertToHierarchy(paths /* array of array of strings */) { 
 
    // Build the node structure 
 
    const rootNode = {name:"root", children:[]} 
 
    
 
    for (let path of paths) { 
 
    buildNodeRecursive(rootNode, path.split('/'), 0); 
 
    } 
 
    
 
    return rootNode; 
 
} 
 

 
function buildNodeRecursive(node, path, idx) { 
 
    if (idx < path.length) { 
 
    let item = path[idx] 
 
    let dir = node.children.find(child => child.name == item) 
 
    if (!dir) { 
 
     node.children.push(dir = {name: item, children:[]}) 
 
    } 
 
    buildNodeRecursive(dir, path, idx + 1); 
 
    } 
 
}

+0

wow !! Incroyablement travaillé. – Ashwin

+0

https://jsfiddle.net/ashwyn/Laamg14z/3/ a également travaillé. – Ashwin

+0

Ce violon n'a pas retourné la même chose que vous attendiez dans la sortie – Endless