1. 程式人生 > >JS 陣列轉樹結構程式碼

JS 陣列轉樹結構程式碼

/* *函式定義 *入口引數data,平行陣列 *key,id欄位 *parentKey,父欄位 *map,需要將原始屬性名稱轉換為什麼名稱 */ function treeUtil(data,key,parentKey,map) { this.data=data; this.key=key; this.parentKey=parentKey; this.treeParentKey=parentKey; //parentKey要轉換成什麼屬性名稱 this
.treeKey=key; //key要轉換成什麼屬性名稱 this.map=map; if(map){ if(map[key])this.treeKey=map[key]; } this.toTree=function () { var data=this.data; var pos={}; var tree=[]; var i=0; while(data.length!=0
){ if(data[i][this.parentKey]==0){ var _temp = this.copy(data[i]); tree.push(_temp); pos[data[i][this.key]]=[tree.length-1]; data.splice(i,1); i--; }else{ var
posArr=pos[data[i][this.parentKey]]; if(posArr!=undefined){ var obj=tree[posArr[0]]; for(var j=1;j<posArr.length;j++){ obj=obj.children[posArr[j]]; } var _temp=this.copy(data[i]); obj.children.push(_temp); pos[data[i][this.key]]=posArr.concat([obj.children.length-1]); data.splice(i,1); i--; } } i++; if(i>data.length-1){ i=0; } } return tree; } this.copy=function (item) { var _temp={ children:[] }; _temp[this.treeKey]=item[this.key]; for(var _index in item){ if(_index!=this.key && _index!=this.parentKey){ var _property = item[_index]; if((!!this.map) && this.map[_index]) _temp[this.map[_index]]=_property; else _temp[_index]=_property; } } return _temp; } } //使用示例,data需要有key parentKey屬性,其它屬性內容沒有限制。 var data=[ {id:1,parent:0,text:'A'}, {id:2,parent:4,text:"B"}, {id:3,parent:7,text:"C"}, {id:4,parent:1,text:"D"}, {id:5,parent:0,text:"E"}, {id:6,parent:5,text:'B'}, {id:7,parent:4,text:"F"} ]; //簡單使用 var tree = new treeUtil(data,'id','parent'); console.log(tree.toTree()); //帶屬性名稱轉換 data=[ {id:1,parent:0,text:'A'}, {id:2,parent:4,text:"B"}, {id:3,parent:7,text:"C"}, {id:4,parent:1,text:"D"}, {id:5,parent:0,text:"E"}, {id:6,parent:5,text:'B'}, {id:7,parent:4,text:"F"} ]; var map={"text":"title","id":"id0"}; var tree1 = new treeUtil(data,'id','parent',map); console.log(tree1.toTree());