簡體   English   中英

在Typescript中將數組轉換為樹

[英]Convert an Array to Tree in Typescript

我在這樣存儲的對象數組中有結構數據庫:

 arry = [{"name": "a", "id": "2", "data":"foo", "parent": "1"},
 {"name": "b", "id": "3", "data":"foo", "parent": "2"},
 {"name": "c", "id": "4", "data":"foo", "parent": "3"},
 {"name": "d", "id": "5", "data":"foo", "parent": "3"},
 {"name": "e", "id": "6", "data":"foo", "parent": "4"},
 {"name": "f", "id": "7", "data":"foo", "parent": "5"}]

我想要這樣的嵌套結構

{
"2":{
   "name": "a",
   "data": "foo",
  "3":{
     "name": "b",
     "data":"foo",
     "4":{
        "name": "c",
        "data":"foo",
        "6":{
           "name": "e",
           "data": "foo",
          };
       },
      "5":{
         "name": "d",
         "data": "foo",
         "7":{
            "name": "f",
            "data": "foo"
           }
        }
      }
    }
  };

所以我可以使用它Angular Material樹。

為此,您可以使用每個節點的id作為索引,將節點數組簡化為字典。

這樣,您將可以通過字典的ID直接訪問所有節點。 因此,您將能夠輕松地將每個節點存儲在其父節點中。

一旦所有節點都存儲在各自的父節點中,您只需從字典中獲取根節點,它將保存您所有的樹。

解析子級時,可能會發生父級不在字典中的情況,在這種情況下,您可以使用一個虛擬對象,該對象將在我們解析實際父級節點時扮演一個占位符。

 var arry = [ {"name": "a", "id": "2", "data":"foo", "parent": "1"}, {"name": "b", "id": "3", "data":"foo", "parent": "2"}, {"name": "c", "id": "4", "data":"foo", "parent": "3"}, {"name": "d", "id": "5", "data":"foo", "parent": "3"}, {"name": "e", "id": "6", "data":"foo", "parent": "4"}, {"name": "f", "id": "7", "data":"foo", "parent": "5"} ]; function totree(branches, node) { // if we don't have the parent yet if (!branches[node.parent]) { // create a dummy placeholder for now branches[node.parent] = {}; } // store our node in its parent branches[node.parent][node.id] = node; // store our node in the full list // copy all added branches on possible placeholder branches[node.id] = Object.assign(node, branches[node.id]); return branches; } var tree = arry.reduce(totree, {})['1']; // get only the root node ('1') console.log(tree); 

暫無
暫無

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

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