簡體   English   中英

從字符串列表創建一棵樹 - javascript

[英]Create a tree from a list of strings - javascript

我有一個對象數組,我想創建一個視圖樹。 但是我在創建時遇到了問題。 我的名字 Test1/Test2 和 Test1/Test2/Test3 (id 147) 在最后的樹中被遺漏了。

我的片段:

 let arr = [{id: 145, name: "Test1/Test2", public: false}, {id: 146, name: "Test1/Test2/Test3", public: false}, {id: 147, name: "Test1/Test2/Test3", public: false}, {id: 148, name: "Test1/Test2/Test4", public: false}]; let result = []; let level = { result }; arr.forEach((path) => { path.name.split("/").reduce((r, name, i, a) => { if (!r[name]) { r[name] = { result: [], id: path.id }; r.result.push({ name, children: r[name].result }); } return r[name]; }, level); }); console.log(result)

預期結果:

[
      {
        name: "Test1",
        children: [
          {
            name: "Test2",
            children: [],
            id: 145
          },
          {
            name: "Test2",
            children: [
              {
                name: "Test3",
                children: [],
                id: 146
              },
              {
                name: "Test3",
                children: [],
                id: 147
              },
              {
                name: "Test4",
                children: [],
                id: 148
              },
            ],
          },
        ],
      },
    ];

如果我理解得很好,樹中的葉子數應該等於輸入數組中的條目數。 所以一片葉子永遠不會生孩子。 這就是讓你給“Test1”兩個孩子的原因,即使所有路徑都將“Test2”作為下一部分:一個孩子作為葉子,另一個作為內部節點。

因此,葉子並不真正需要children屬性,因為該children數組將始終保持為空。

很明顯,路徑的最后一個元素需要稍微不同地處理。 該部分應始終導致在樹中創建新節點。 如果可用,其他部分可以重用(非葉)節點。

這會導致您的代碼發生以下變化:

 let arr = [ {id: 145, name: "Test1/Test2", public: false}, {id: 146, name: "Test1/Test2/Test3", public: false}, {id: 147, name: "Test1/Test2/Test3", public: false}, {id: 148, name: "Test1/Test2/Test4", public: false} ]; let result = []; let level = { result }; arr.forEach(({name, id}) => { // destructure let parts = name.split("/"); name = parts.pop(); // don't pass the last part through reducer parts.reduce((r, name, i) => { if (!r[name]) { r[name] = { result: [] }; r.result.push({ name, children: r[name].result }); } return r[name]; }, level).result.push({ name, id }); // add last part here }); console.log(result);

暫無
暫無

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

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