簡體   English   中英

扁平結構到樹結構

[英]Flat Structure to Tree Structure

我已經完成了關於這個主題的答案,但我無法獲得所需的輸出。 因此,我再次問這個問題。

 var data = [ { Title : "Report 1" , Parent : "root"} , { Title : "Report 2" , Parent : "root"} , { Title : "Report 3" , Parent : "root"} , { Title : "View 1" , Parent : "Report 1"} , { Title : "View 2" , Parent : "Report 1"} , { Title : "Table 1" , Parent : "View 1"} , { Title : "Table 2" , Parent : "View 1"} , { Title : "Table 3" , Parent : "View 1"} , { Title : "SLT" , Parent : "Table 1"} , { Title : "SRS" , Parent : "Table 2"} , { Title : "INFORMATICA" , Parent : "Table 3"} , { Title : "Table 3" , Parent : "View 2"} , { Title : "Table 4" , Parent : "View 2"} , { Title : "Table 5" , Parent : "View 2"} , { Title : "SLT" , Parent : "Table 4"} , { Title : "SLT" , Parent : "Table 5"} , { Title : "View 1" , Parent : "Report 2"} , { Title : "View 3" , Parent : "Report 2"} , { Title : "View 4" , Parent : "Report 2"} , { Title : "Table 6" , Parent : "View 3"} , { Title : "Table 7" , Parent : "View 3"} , { Title : "Table 3" , Parent : "View 3"} , { Title : "Table 8" , Parent : "View 4"} , { Title : "Table 9" , Parent : "View 4"} , { Title : "Table 10" , Parent : "View 4"} , { Title : "SLT" , Parent : "Table 6"} , { Title : "SRS" , Parent : "Table 7"} , { Title : "INFORMATICA" , Parent : "Table 8"} , { Title : "SLT" , Parent : "Table 9"} , { Title : "SRS" , Parent : "Table 10"} , { Title : "View 5" , Parent : "Report 3"} , { Title : "View 6" , Parent : "Report 3"} , { Title : "View 7" , Parent : "Report 3"} , { Title : "View 8" , Parent : "Report 3"} , { Title : "Table 11" , Parent : "View 5"} , { Title : "Table 12" , Parent : "View 5"} , { Title : "Table 13" , Parent : "View 5"} , { Title : "Table 14" , Parent : "View 5"} , { Title : "Table 15" , Parent : "View 6"} , { Title : "Table 16" , Parent : "View 6"} , { Title : "Table 17" , Parent : "View 6"} , { Title : "Table 18" , Parent : "View 6"} , { Title : "Table 19" , Parent : "View 7"} , { Title : "Table 20" , Parent : "View 7"} , { Title : "Table 21" , Parent : "View 8"} , { Title : "Table 22" , Parent : "View 8"} , { Title : "Table 23" , Parent : "View 8"} , { Title : "SLT" , Parent : "Table 11"} , { Title : "SRS" , Parent : "Table 12"} , { Title : "INFORMATICA" , Parent : "Table 13"} , { Title : "SLT" , Parent : "Table 14"} , { Title : "SRS" , Parent : "Table 15"} , { Title : "INFORMATICA" , Parent : "Table 16"} , { Title : "SLT" , Parent : "Table 17"} , { Title : "SRS" , Parent : "Table 18"} , { Title : "INFORMATICA" , Parent : "Table 19"} , { Title : "SLT" , Parent : "Table 20"} , { Title : "SRS" , Parent : "Table 21"} , { Title : "INFORMATICA" , Parent : "Table 22"} , { Title : "INFORMATICA" , Parent : "Table 23"} , ]; var root = {}; var parentCache = {}; // for each element definition in the data array for (var i = 0; i < data.length; i++) { var element = data[i]; var Title = element.Title; // create a new object and initialize var newObj = {"Title" : Title}; newObj["children"] = []; // put this object into its parent if (element.Parent === "root") { root[Title] = newObj; } else { // XXX - if the parent isn't defined first this will fail var parent = parentCache[element.Parent]; parent.children.push(newObj); //need to run a loop on 'root' to push at different nodes, how? } // store this object in case it is a parent parentCache[Title] = newObj; } document.write('<pre>' + JSON.stringify(root, 0, 4) + '</pre>'); // console.log(JSON.stringify(root));

代碼的 JSBIN 鏈接

我無法在報告 2 下推送表 1 --> 視圖 1和所有其他節點,如果根對象中存在任何視圖 1 對象。 如何解決這個問題?

理解這一點的最簡單方法可能是將每個數據對象轉換為帶有附加children: []節點的樹節點children: []數組。 然后將每個節點添加為任何聲稱具有與子節點所說的Parent匹配的Title節點的子節點。 當然,這可能會將子項添加到樹中的多個位置(父項不是唯一的),但我相信這就是您想要的。 我將在沒有算法優化的情況下執行此操作,只是為了保持簡單,以便您了解修復程序。

認識到 parent 不是唯一的這一事實應該引導您遠離構建parentCache 可能有多個節點有資格成為任何給定節點的父節點。 事實上,任何具有正確 Title 的對象都將是這樣的父對象。

 var data = [ { Title : "Report 1" , Parent : "root"} , { Title : "Report 2" , Parent : "root"} , { Title : "Report 3" , Parent : "root"} , { Title : "View 1" , Parent : "Report 1"} , { Title : "View 2" , Parent : "Report 1"} , { Title : "Table 1" , Parent : "View 1"} , { Title : "Table 2" , Parent : "View 1"} , { Title : "Table 3" , Parent : "View 1"} , { Title : "SLT" , Parent : "Table 1"} , { Title : "SRS" , Parent : "Table 2"} , { Title : "INFORMATICA" , Parent : "Table 3"} , { Title : "Table 3" , Parent : "View 2"} , { Title : "Table 4" , Parent : "View 2"} , { Title : "Table 5" , Parent : "View 2"} , { Title : "SLT" , Parent : "Table 4"} , { Title : "SLT" , Parent : "Table 5"} , { Title : "View 1" , Parent : "Report 2"} , { Title : "View 3" , Parent : "Report 2"} , { Title : "View 4" , Parent : "Report 2"} , { Title : "Table 6" , Parent : "View 3"} , { Title : "Table 7" , Parent : "View 3"} , { Title : "Table 3" , Parent : "View 3"} , { Title : "Table 8" , Parent : "View 4"} , { Title : "Table 9" , Parent : "View 4"} , { Title : "Table 10" , Parent : "View 4"} , { Title : "SLT" , Parent : "Table 6"} , { Title : "SRS" , Parent : "Table 7"} , { Title : "INFORMATICA" , Parent : "Table 8"} , { Title : "SLT" , Parent : "Table 9"} , { Title : "SRS" , Parent : "Table 10"} , { Title : "View 5" , Parent : "Report 3"} , { Title : "View 6" , Parent : "Report 3"} , { Title : "View 7" , Parent : "Report 3"} , { Title : "View 8" , Parent : "Report 3"} , { Title : "Table 11" , Parent : "View 5"} , { Title : "Table 12" , Parent : "View 5"} , { Title : "Table 13" , Parent : "View 5"} , { Title : "Table 14" , Parent : "View 5"} , { Title : "Table 15" , Parent : "View 6"} , { Title : "Table 16" , Parent : "View 6"} , { Title : "Table 17" , Parent : "View 6"} , { Title : "Table 18" , Parent : "View 6"} , { Title : "Table 19" , Parent : "View 7"} , { Title : "Table 20" , Parent : "View 7"} , { Title : "Table 21" , Parent : "View 8"} , { Title : "Table 22" , Parent : "View 8"} , { Title : "Table 23" , Parent : "View 8"} , { Title : "SLT" , Parent : "Table 11"} , { Title : "SRS" , Parent : "Table 12"} , { Title : "INFORMATICA" , Parent : "Table 13"} , { Title : "SLT" , Parent : "Table 14"} , { Title : "SRS" , Parent : "Table 15"} , { Title : "INFORMATICA" , Parent : "Table 16"} , { Title : "SLT" , Parent : "Table 17"} , { Title : "SRS" , Parent : "Table 18"} , { Title : "INFORMATICA" , Parent : "Table 19"} , { Title : "SLT" , Parent : "Table 20"} , { Title : "SRS" , Parent : "Table 21"} , { Title : "INFORMATICA" , Parent : "Table 22"} , { Title : "INFORMATICA" , Parent : "Table 23"} , ]; var root = { Title: "root", children: [] }; var parentCache = {}; // Put a root node into the tree var nodes = data.map((e) => { return { Title: e.Title, Parent: e.Parent, children: [] }; }); nodes.push(root); // Brute force: add each node as a child of its parent. for (var iChild = 0; iChild < nodes.length; ++iChild) { for (var iParent = 0; iParent < nodes.length; ++iParent) { if (nodes[iParent].Title == nodes[iChild].Parent) { nodes[iParent].children.push(nodes[iChild]); } } } document.write('<pre>' + JSON.stringify(root, 0, 4) + '</pre>'); // console.log(JSON.stringify(root));

如果你想優化它,你仍然可以構造一個父緩存,但緩存中的每個條目都是具有匹配標題字符串的所有元素的列表 然后,您將遍歷每個元素並將其添加為所有父元素的子元素。 這會將父項的搜索時間降低到 O(1) 而不是 O(N)。 但是我發布的示例將使用 O(N^2) 方法,因為它更容易理解您的原始問題是什么。

編輯:索引解決方案

應@alQemist 的要求,我添加了一個解決方案版本,該版本使用索引來允許在恆定時間內定位父節點。

 var data = [ { Title : "Report 1" , Parent : "root"} , { Title : "Report 2" , Parent : "root"} , { Title : "Report 3" , Parent : "root"} , { Title : "View 1" , Parent : "Report 1"} , { Title : "View 2" , Parent : "Report 1"} , { Title : "Table 1" , Parent : "View 1"} , { Title : "Table 2" , Parent : "View 1"} , { Title : "Table 3" , Parent : "View 1"} , { Title : "SLT" , Parent : "Table 1"} , { Title : "SRS" , Parent : "Table 2"} , { Title : "INFORMATICA" , Parent : "Table 3"} , { Title : "Table 3" , Parent : "View 2"} , { Title : "Table 4" , Parent : "View 2"} , { Title : "Table 5" , Parent : "View 2"} , { Title : "SLT" , Parent : "Table 4"} , { Title : "SLT" , Parent : "Table 5"} , { Title : "View 1" , Parent : "Report 2"} , { Title : "View 3" , Parent : "Report 2"} , { Title : "View 4" , Parent : "Report 2"} , { Title : "Table 6" , Parent : "View 3"} , { Title : "Table 7" , Parent : "View 3"} , { Title : "Table 3" , Parent : "View 3"} , { Title : "Table 8" , Parent : "View 4"} , { Title : "Table 9" , Parent : "View 4"} , { Title : "Table 10" , Parent : "View 4"} , { Title : "SLT" , Parent : "Table 6"} , { Title : "SRS" , Parent : "Table 7"} , { Title : "INFORMATICA" , Parent : "Table 8"} , { Title : "SLT" , Parent : "Table 9"} , { Title : "SRS" , Parent : "Table 10"} , { Title : "View 5" , Parent : "Report 3"} , { Title : "View 6" , Parent : "Report 3"} , { Title : "View 7" , Parent : "Report 3"} , { Title : "View 8" , Parent : "Report 3"} , { Title : "Table 11" , Parent : "View 5"} , { Title : "Table 12" , Parent : "View 5"} , { Title : "Table 13" , Parent : "View 5"} , { Title : "Table 14" , Parent : "View 5"} , { Title : "Table 15" , Parent : "View 6"} , { Title : "Table 16" , Parent : "View 6"} , { Title : "Table 17" , Parent : "View 6"} , { Title : "Table 18" , Parent : "View 6"} , { Title : "Table 19" , Parent : "View 7"} , { Title : "Table 20" , Parent : "View 7"} , { Title : "Table 21" , Parent : "View 8"} , { Title : "Table 22" , Parent : "View 8"} , { Title : "Table 23" , Parent : "View 8"} , { Title : "SLT" , Parent : "Table 11"} , { Title : "SRS" , Parent : "Table 12"} , { Title : "INFORMATICA" , Parent : "Table 13"} , { Title : "SLT" , Parent : "Table 14"} , { Title : "SRS" , Parent : "Table 15"} , { Title : "INFORMATICA" , Parent : "Table 16"} , { Title : "SLT" , Parent : "Table 17"} , { Title : "SRS" , Parent : "Table 18"} , { Title : "INFORMATICA" , Parent : "Table 19"} , { Title : "SLT" , Parent : "Table 20"} , { Title : "SRS" , Parent : "Table 21"} , { Title : "INFORMATICA" , Parent : "Table 22"} , { Title : "INFORMATICA" , Parent : "Table 23"} , ]; var root = { Title: "root", parents: [], children: [] }; // Put a root node into the tree var nodes = data.map((e) => { return { Title: e.Title, Parent: e.Parent, parents: [], children: [] }; }); nodes.push(root); // construct a title index let titleIndex = {}; nodes.forEach(n => { titleIndex[n.Title] = n; }); document.write('<h1>The Index</h1><pre>' + JSON.stringify(titleIndex, 0, 4) + '</pre>'); // Each node will have a list of its parents. Locate each parent with the index. nodes.forEach(n => { if (n.Parent) n.parents.push(titleIndex[n.Parent]); }); // Push each node as a child of all its parents. Delete the parents list to avoid circular JSON. nodes.forEach(n => { n.parents.forEach(p => { p.children.push(n); }); delete n.parents; }); document.write('<h1>The Tree</h1><pre>' + JSON.stringify(root, 0, 4) + '</pre>');

暫無
暫無

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

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