2017-07-13 9 views
0

私はディレクトリパスのフラットリストを持っています。私はそれを階層に変換したい。階層ディレクトリへのフラットディレクトリパス

入力フォーマット:私の入力で

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

出力形式

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

、私は、任意の親のパラメータを持つことはできません。私の進行中のフィドルはここにあります - https://jsfiddle.net/ashwyn/Laamg14z/2/

ありがとう。

+0

_ _ "私は時間制約の午前" - これは、あなたがより速く答えを得る助けにはなりません。代わりに[mcve]を使用してあなたの関連するコードをすべてあなたの質問に入れてください。 – evolutionxbox

答えて

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

うわー!!驚くほど働いた。 – Ashwin

+0

https://jsfiddle.net/ashwyn/Laamg14z/3/も働いていました。 – Ashwin

+0

そのフィドルはあなたが出力で期待したものと同じものを返さなかった – Endless