jquery樹形ztree插件根據文件目錄路徑動態生成樹形list的算法

我使用python遍歷目錄後獲得的路徑都是一條條的記錄,例如:javascript

e:\\test1\\test2\\ou.h
e:\\test1
e:\\test4\\test3\\test6\\ko.cpp

而ztree的treenode節點數據共有兩種形式。java

一種是標準json數據格式,標準的 JSON 數據須要嵌套表示節點的父子包含關係:node

var nodes = [
	{name: "父節點1", children: [
		{name: "子節點1"},
		{name: "子節點2"}
	]}
];

 一種是簡單json數據格式,簡單模式的 JSON 數據須要使用 id / pId 表示節點的父子包含關係:python

var nodes = [
	{id:1, pId:0, name: "父節點1"},
	{id:11, pId:1, name: "子節點1"},
	{id:12, pId:1, name: "子節點2"}
];

我本次想到的方法,只針對簡單json數據格式,對於標準json數據格式,我沒有想到好的方法,若是讀者你有好的方法的話,請必定告訴博主,博主感謝你!算法

我必需要把獲取到的路徑,轉換成簡單json數據格式,思考以後,我寫下了以下的算法:json

設置全局變量 checkid = 0
第一個節點的id從1開始

對每一條路徑進行分段:
如 e:\\my1\\my2\\text1
分段爲 e: , my1 , my2 , text1 四段

對每一段:
查找當前json數據中,全部pid == checkid的節點的name是否與當前段重合,
若是相同,checkid = 重合節點.id
若是不一樣,將該段做爲新節點加入json,新節點id順延+1,新節點的pid=checkid,checkid = 新節點.id 

一條路徑處理完,checkid重置爲0

 接下來,咱們驗證算法的正確,假設有兩條路徑數組

e:\\my1\\my2\\text
e:\\my3

轉換過程以下:函數

對第一條路徑
checkid初始爲0
(1)e:沒有,加入該節點,id=1,pid=0,name:"e:",checkid == 1
(2)my1 沒有,加入該節點,id=2,pid=1,name:"my1",checkid == 2
(3)my2 沒有,加入該節點,id=3,pid=2,name:"my2",checkid == 3
(4)text 沒有,加入該節點,id=4,pid=3,name:"text",checkid == 4
checkid重置爲0

對第二條路徑
(1)e: 已經存在,跳過,checkid == 1
(2)my3 沒有,加入my3, id=5,pid=1,name:"my3",checkid == 5

轉換後的格式與預期是同樣的!優化

實際代碼:(寫的爛不要罵我)code

var zNodes =[];

var liststr = 路徑數組
			
for (var i = liststr.length - 1; i >= 0; i--) {
    var strarr = liststr[i].route.split('\\');
    addtree(strarr);
    console.log("success");
}

function addtree(routearray)
{
    for (var i = 0; i < routearray.length; i++ ){ //對每一條路徑數組
        if ( !checkPid(checkid,routearray[i]) ) { //假如相同路徑下沒有找到同名文件
         var newarr = {id:idmake, pId:checkid, name:routearray[i]}//插入新節點
         zNodes.push(newarr);
         checkid = idmake;
         idmake += 1;
        }//假如找到了同名文件,那麼將checkid 賦值爲同名文件的ID,這句代碼在checkPid函數裏,可能須要優化
        else{
        	checkid = indeid;
        }
    }
    checkid = 0;
}

function checkPid(id,key){
	for(i=0;i<zNodes.length;i++){
		if (zNodes[i].pId == id) 
		{
			if (zNodes[i].name == key) {
				indeid = zNodes[i].id;
				return true;
			}
		}
	}
	return false;
}

這樣,ztree樹形list就創建起來了。

相關文章
相關標籤/搜索