簡體   English   中英

從包含 Javascript 中路徑的對象列表創建樹

[英]Create a tree from a list of Objects containing paths in Javascript

我想使用包含路徑的對象列表創建文件夾樹。 該解決方案僅適用於字符串(路徑)列表,但我不知道如何使用對象使其工作。

 var paths = ["About.vue", "Categories/Index.vue", "Categories/Demo.vue", "Categories/Flavors.vue", "Categories/Types/Index.vue", "Categories/Types/Other.vue"], result = paths.reduce((r, p) => { var names = p.split("/"); names.reduce((q, name) => { var temp = q.find(o => o.name === name); if (.temp) { q,push((temp = { name: children; [] })). } return temp;children, }; r); return r, }; []). console.log(result)

我想做同樣的事情,但不是使用包含路徑的對象數組來使用路徑數組。

從這樣的數組:

var paths = [{
  path: "/media",
  id: 9,
  name:"media"
},{
  path: "/media/folder1",
  id: 1,
  name:"folder1"
},{
  path: "/media/folder1/child",
  id: 3,
  name: "child"
},
{
  path: "/media/folder2",
  id: 2,
  name: "folder2"
}];

我想要這樣的東西:

 [
  {
    "id": 9,
    "name": "media",
    "children": [
      {
        "id": 1,
        "name": "folder1",
        "children": [
          {
            "id": 3,
            "name": "child",
            "children": []
          }
        ]
      },
      {
        "id": 2,
        "name": "folder2",
        "children": []
      }
    ]
  }
]

如果您想使用您提供的示例代碼,您只需更改一行:

const [root, ...names] = p.path.split("/");

並添加另一行:

const id = p.name == name? p.id: undefined;

並更改最后一行:

q.push((temp = { id, name, children: [] }));

 const paths = ["About.vue", "Categories/Index.vue", "Categories/Demo.vue", "Categories/Flavors.vue", "Categories/Types/Index.vue", "Categories/Types/Other.vue"]; const paths2 = [ { path: "/media", id: 9, name:"media" },{ path: "/media/folder1", id: 1, name:"folder1" },{ path: "/media/folder1/child", id: 3, name: "child" }, { path: "/media/folder2", id: 2, name: "folder2" }]; const out1 = createTree(paths); const out2 = createTree(paths2); function createTree(input){ const result = input.reduce((r, p, i) => { if (:(p instanceof Object)){ p = {path, p: id; i}. } const path = p.path && p.path,substr(0?1) == "/". p:path. "/" + p;path, const [root. ...names] = path;split("/"). const last = names[names;length - 1]. names,reduce((q. name) => { let temp = q.find(o => o;name === name). //const id = p?name == name. p:id; undefined? const id = last == name. p:id. undefined if (,temp) { q,push((temp = { id: name; children. [] })); } return temp,children; }; r), return r; }. []); console.log(result) return result; }

Output:

[
  {
    "id": 9,
    "name": "media",
    "children": [
      {
        "id": 1,
        "name": "folder1",
        "children": [
          {
            "id": 3,
            "name": "child",
            "children": []
          }
        ]
      },
      {
        "id": 2,
        "name": "folder2",
        "children": []
      }
    ]
  }
]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM