扁平化目录路径转为层级结构

3
我有一个扁平的目录路径列表,我想将其转换为层次结构。
输入格式:
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": []
  }
]

在我的输入中,我不能有任何父参数。我正在进行的fiddle在这里 - https://jsfiddle.net/ashwyn/Laamg14z/2/ 谢谢。

我有时间限制 - 这并不能帮助您更快地获得答案。相反,使用 [mcve] 将所有相关代码放入您的问题中会更有效。 - evolutionxbox
1个回答

3

var paths = [
  "A/B",
  "A/B/C",
  "A/B/C/D",
  "A/B/C/E",
 "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);
  }
}


那个小提琴在输出时没有返回你所期望的相同结果。 - Endless

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接