123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- /**
- * Created by vian on 2017/3/31.
- */
- var test = require("tape");
- test("testMyBillsTree:", function(t){
- var billsData = [
- {ID: 2, ParentID: -1, NextSiblingID: 3},
- {ID: 1, ParentID: -1, NextSiblingID: 2},
- {ID: 3, ParentID: -1, NextSiblingID: 9},
- {ID: 4, ParentID: 3, NextSiblingID: 5},
- {ID: 5, ParentID: 3, NextSiblingID: -1},
- {ID: 6, ParentID: 4, NextSiblingID: 7},
- {ID: 7, ParentID: 4, NextSiblingID: -1},
- {ID: 8, ParentID: 6, NextSiblingID: -1},
- {ID: 10, ParentID: -1, NextSiblingID: -1},
- {ID: 9, ParentID: -1, NextSiblingID: 10},
- {ID: 11, ParentID: 10, NextSiblingID: -1},
- {ID: 12, ParentID: 11, NextSiblingID: -1},
- {ID: 13, ParentID: 12, NextSiblingID: -1},
- {ID: 14, ParentID: 13, NextSiblingID: -1},
- {ID: 15, ParentID: 14, NextSiblingID: 16},
- {ID: 16, ParentID: 14, NextSiblingID: 17},
- {ID: 17, ParentID: 14, NextSiblingID: -1},
- {ID: 18, ParentID: 17, NextSiblingID: 19},
- {ID: 19, ParentID: 17, NextSiblingID: -1},
- {ID: 20, ParentID: 1, NextSiblingID: -1},
- ]
- function getTop(data, topId){
- var top = [];
- for(var i=0; i<data.length; i++){
- if(data[i].ParentID == -1 ||data[i].ParentID == topId){
- top.push(data[i]);
- }
- }
- return top;
- }
- function sortNodes(nodes){
- for(var i=0; i<nodes.length; i++){
- for(var j=i+1; j<nodes.length; j++){
- var temp;
- if(nodes[i].NextSiblingID == nodes[j].ID){
- temp = nodes[i+1];
- nodes[i+1] = nodes[j];
- nodes[j] = temp;
- }
- }
- if(nodes[i].NextSiblingID == nodes[0].ID){
- var topNode = nodes[i];
- for(var j=nodes.length-2; j>=0; j-- ){
- nodes[j+1] = nodes[j];
- }
- nodes[0] = topNode;
- }
- }
- return nodes;
- }
- function getNodeChildren(node, children){
- for(var i=0; i<billsData.length; i++){
- if(billsData[i].ParentID == node.ID){
- children.push(billsData[i].ID);
- getNodeChildren(billsData[i], children);
- }
- }
- return children;
- }
- function buildChildren(billsData){
- var tempTree = [];
- for(var i=0; i<billsData.length; i++){
- var children = [];
- getNodeChildren(billsData[i], children);
- tempTree.push({"ID": billsData[i].ID, "ParentID": billsData[i].ParentID, "NextSiblingID": billsData[i].NextSiblingID, "children": children});
- }
- return tempTree;
- }
- function getNodes(data ,ids){
- var idsNodes = [];
- for(var i =0; i<ids.length; i++){
- for(var j=0 ; j<data.length; j++){
- if(ids[i] == data[j].ID){
- idsNodes.push({ID: data[j].ID, ParentID: data[j].ParentID, NextSiblingID: data[j].NextSiblingID, children: data[j].children});
- }
- }
- }
- return idsNodes;
- }
- function buildTree(treeContainer, billsData, tempTree, topId){
- var sortTempTree = sortNodes(getTop(tempTree, topId));
- for(var i=0; i<sortTempTree.length; i++){
- if(sortTempTree[i].children.length > 0){
- treeContainer.push({"ID": sortTempTree[i].ID, "ParentID": sortTempTree[i].ParentID, "NextSiblingID": sortTempTree[i].NextSiblingID, "children": sortTempTree[i].children});
- var childrenTree = getNodes(buildChildren(billsData), sortTempTree[i].children);
- buildTree(treeContainer, billsData, childrenTree, sortTempTree[i].ID);
- }
- else {
- treeContainer.push({"ID": sortTempTree[i].ID, "ParentID": sortTempTree[i].ParentID, "NextSiblingID": sortTempTree[i].NextSiblingID, "children": sortTempTree[i].children});
- }
- }
- return treeContainer;
- }
- //console.log("sortNodes:====================");
- //console.log(sortNodes(getTop(buildChildren(billsData))));
- // console.log("buildChildren:====================");
- // console.log(buildChildren(billsData));
- console.log("buildTree:====================");
- var billsTree = [];
- console.log(buildTree(billsTree, billsData, buildChildren(billsData), -1));
- t.end();
- });
|