|
@@ -1,81 +1,58 @@
|
|
/**
|
|
/**
|
|
* Created by Tony on 2017/1/23.
|
|
* Created by Tony on 2017/1/23.
|
|
*/
|
|
*/
|
|
|
|
+const NODE_ID = "ID", P_ID = "ParentID", NEXT_ID = "NextSiblingID", ADHOC_PRE_ID="Previous_ID", CHILDREN_NODE = "items", SUB_ID = "sub_ids", EMPTY_ID_VAL = -1;
|
|
|
|
+
|
|
var tree_Data_Helper = {
|
|
var tree_Data_Helper = {
|
|
- sortDataBySerial: function (data) {
|
|
|
|
- data.sort(function(item1, item2) {
|
|
|
|
- var rst = 0;
|
|
|
|
- if (item1["SerialNo"] > item2["SerialNo"]) {
|
|
|
|
- rst = 1;
|
|
|
|
- } else if (item1["SerialNo"] < item2["SerialNo"]) {
|
|
|
|
- rst = -1;
|
|
|
|
|
|
+ buildTreeNodeDirectly: function(data) {
|
|
|
|
+ var me = this, topArr = [], rst = [], tmpNodes = {}, prefix = "id_";
|
|
|
|
+ private_getTopNode = function (idArr) {
|
|
|
|
+ var rst = null;
|
|
|
|
+ for (var i = 0; i < idArr.length; i++) {
|
|
|
|
+ if (tmpNodes[prefix + idArr[i]][ADHOC_PRE_ID] == EMPTY_ID_VAL) {
|
|
|
|
+ rst = tmpNodes[prefix + idArr[i]];
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
return rst;
|
|
return rst;
|
|
- });
|
|
|
|
- },
|
|
|
|
-
|
|
|
|
- buildTreeData: function (data) {
|
|
|
|
- var rst = [], idArr = [], me = this;
|
|
|
|
- var distIdx = -1, distinctIdx = 0;
|
|
|
|
- for (var i = 0; i < data.length; i++) {
|
|
|
|
- idArr.push(i);
|
|
|
|
- }
|
|
|
|
- me.distinctByCustId(data, idArr, "ParentID", distIdx);
|
|
|
|
- distinctIdx = me.getDistinctId(data, idArr, distIdx);
|
|
|
|
- for (var i = 0; i < distinctIdx; i++) {
|
|
|
|
- rst[i] = data[idArr[i]];
|
|
|
|
- }
|
|
|
|
- for (var i = 0; i < rst.length; i++) {
|
|
|
|
- idArr = idArr.slice(distinctIdx);
|
|
|
|
- me.buildBranchData(rst[i], data, idArr);
|
|
|
|
}
|
|
}
|
|
- return rst;
|
|
|
|
- },
|
|
|
|
-
|
|
|
|
- getDistinctId: function (data, idArr, compareVal) {
|
|
|
|
- var rst = 0, me = this;
|
|
|
|
- for (var i = 0; i < idArr.length; i++) {
|
|
|
|
- if (data[idArr[i]]["ParentID"] != compareVal) {
|
|
|
|
- rst = i;
|
|
|
|
- break;
|
|
|
|
|
|
+ private_buildNodeData = function(parentItem, idArr) {
|
|
|
|
+ var iter = [], nextNode = private_getTopNode(idArr);
|
|
|
|
+ while (nextNode != null && nextNode != undefined ) {
|
|
|
|
+ if (parentItem) {
|
|
|
|
+ parentItem[CHILDREN_NODE].push(nextNode);
|
|
|
|
+ } else {
|
|
|
|
+ rst.push(nextNode);
|
|
|
|
+ }
|
|
|
|
+ iter.push(nextNode);
|
|
|
|
+ nextNode = tmpNodes[prefix + nextNode[NEXT_ID]];
|
|
|
|
+ }
|
|
|
|
+ for (var i = 0; i < iter.length; i++) {
|
|
|
|
+ private_buildNodeData(iter[i], iter[i][SUB_ID]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- return rst;
|
|
|
|
- },
|
|
|
|
|
|
|
|
- buildBranchData: function (parentItem, orgData, idArr) {
|
|
|
|
- var distinctIdx = 0, distVal = parentItem["ID"], me = this;
|
|
|
|
- me.distinctByCustId(orgData, idArr, "ParentID", distVal);
|
|
|
|
- distinctIdx = me.getDistinctId(orgData, idArr, distVal);
|
|
|
|
- parentItem["items"] = [];
|
|
|
|
- for (var i = 0; i < distinctIdx; i++) {
|
|
|
|
- parentItem["items"][i] = orgData[idArr[i]];
|
|
|
|
- }
|
|
|
|
- for (var i = 0; i < parentItem["items"].length; i++) {
|
|
|
|
- idArr = idArr.slice(distinctIdx);
|
|
|
|
- me.buildBranchData(parentItem["items"][i], orgData, idArr);
|
|
|
|
- distinctIdx = me.getDistinctId(orgData, idArr, parentItem["items"][i]["ID"]);
|
|
|
|
|
|
+ for (var i = 0; i < data.length; i++) {
|
|
|
|
+ tmpNodes[prefix + data[i][NODE_ID]] = data[i];
|
|
|
|
+ data[i][ADHOC_PRE_ID] = EMPTY_ID_VAL;
|
|
|
|
+ data[i][SUB_ID] = [];
|
|
|
|
+ data[i][CHILDREN_NODE] = [];
|
|
|
|
+ if (data[i][P_ID] == EMPTY_ID_VAL) {
|
|
|
|
+ topArr.push(data[i][NODE_ID]);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- },
|
|
|
|
-
|
|
|
|
- distinctByCustId: function (data, idArray, IdStr, IdVal) {
|
|
|
|
- idArray.sort(function(idx1, idx2) {
|
|
|
|
- var rst = 0;
|
|
|
|
- if (data[idx1][IdStr] == IdVal) {
|
|
|
|
- if (data[idx2][IdStr] == data[idx1][IdStr]) {
|
|
|
|
- if (data[idx1]["SerialNo"] > data[idx2]["SerialNo"]) {
|
|
|
|
- rst = 1;
|
|
|
|
- } else {
|
|
|
|
- rst = -1;
|
|
|
|
- }
|
|
|
|
- } else {
|
|
|
|
- rst = -1;
|
|
|
|
- }
|
|
|
|
- } else if (data[idx2][IdStr] == IdVal) {
|
|
|
|
- rst = 1;
|
|
|
|
|
|
+ for (var i = 0; i < data.length; i++) {
|
|
|
|
+ if (data[i][NEXT_ID] != EMPTY_ID_VAL) {
|
|
|
|
+ tmpNodes[prefix + data[i][NEXT_ID]][ADHOC_PRE_ID] = data[i][NODE_ID];
|
|
}
|
|
}
|
|
- return rst;
|
|
|
|
- });
|
|
|
|
|
|
+ if (data[i][P_ID] != EMPTY_ID_VAL) {
|
|
|
|
+ tmpNodes[prefix + data[i][P_ID]][SUB_ID].push(data[i][NODE_ID]);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ private_buildNodeData(null, topArr);
|
|
|
|
+ //try to release and return
|
|
|
|
+ tmpNodes = null;
|
|
|
|
+ topArr.length = 0;
|
|
|
|
+ return rst;
|
|
}
|
|
}
|
|
-
|
|
|
|
}
|
|
}
|