![](/img/trans.png)
[英]Create a tree from a list of strings containing paths of files - 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.