|  | @@ -1,81 +1,58 @@
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  |   * 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 = {
 | 
	
		
			
				|  |  | -    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;
 | 
	
		
			
				|  |  | -        });
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    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;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  }
 |