JS實(shí)現(xiàn)樹形結(jié)構(gòu)與數(shù)組結(jié)構(gòu)相互轉(zhuǎn)換并在樹形結(jié)構(gòu)中查找對象_第1頁
JS實(shí)現(xiàn)樹形結(jié)構(gòu)與數(shù)組結(jié)構(gòu)相互轉(zhuǎn)換并在樹形結(jié)構(gòu)中查找對象_第2頁
JS實(shí)現(xiàn)樹形結(jié)構(gòu)與數(shù)組結(jié)構(gòu)相互轉(zhuǎn)換并在樹形結(jié)構(gòu)中查找對象_第3頁
JS實(shí)現(xiàn)樹形結(jié)構(gòu)與數(shù)組結(jié)構(gòu)相互轉(zhuǎn)換并在樹形結(jié)構(gòu)中查找對象_第4頁
JS實(shí)現(xiàn)樹形結(jié)構(gòu)與數(shù)組結(jié)構(gòu)相互轉(zhuǎn)換并在樹形結(jié)構(gòu)中查找對象_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第JS實(shí)現(xiàn)樹形結(jié)構(gòu)與數(shù)組結(jié)構(gòu)相互轉(zhuǎn)換并在樹形結(jié)構(gòu)中查找對象總是有很多需求是關(guān)于處理樹形結(jié)構(gòu)的,所以不得不總結(jié)幾個常見操作的寫法。

首先假設(shè)有一個樹形結(jié)構(gòu)數(shù)據(jù)如下

vartree=[

'id':'1',

'name':'教學(xué)素材管理',

'children':[

'id':'101',

'name':'教學(xué)素材',

'children':[

'id':'10101',

'name':'修改',

'id':'10102',

'name':'添加',

},{

'id':'102',

'name':'測試試題',

'id':'103',

'name':'問題任務(wù)',

},{

'id':'2',

'name':'基礎(chǔ)數(shù)據(jù)管理',

'children':[

'id':'201',

'name':'專業(yè)設(shè)置',

'id':'202',

'name':'專業(yè)管理',

]

1、如何在tree中找到id=10102的對象?

思路一:深度遍歷,從頂點(diǎn)開始,當(dāng)前節(jié)點(diǎn)有子節(jié)點(diǎn)則遍歷當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)(遞歸)。

functiondeepQuery(tree,id){

varisGet=false;

varretNode=null;

functiondeepSearch(tree,id){

for(vari=0;itree.length;i++){

if(tree[i].childrentree[i].children.length0){

deepSearch(tree[i].children,id);

if(id===tree[i].id||isGet){

isGet||(retNode=tree[i]);

isGet=true;

break;

deepSearch(tree,id);

returnretNode;

}

調(diào)用:

vargetNode=deepQuery(tree,10102);

console.log(getNode)

思路二:廣度遍歷,遍歷根節(jié)點(diǎn)的所有子節(jié)點(diǎn),再從第一個子節(jié)點(diǎn)開始依次遍歷。

functionbreadthQuery(tree,id){

varstark=[];

stark=stark.concat(tree);

while(stark.length){

vartemp=stark.shift();

if(temp.children){

stark=stark.concat(temp.children);

if(temp.id===id){

returntemp;

}

調(diào)用:

vargetNode=breadthQuery(tree,10102);

console.log(getNode);

2、如何將樹形結(jié)構(gòu)轉(zhuǎn)換為有父子關(guān)系屬性的數(shù)組結(jié)構(gòu)?

思路一:初始化一個空數(shù)組,從tree的頂端開始遍歷,當(dāng)前節(jié)點(diǎn)有子節(jié)點(diǎn)時,一邊繼續(xù)遍歷子節(jié)點(diǎn),一邊在當(dāng)前節(jié)點(diǎn)上刪除子節(jié)點(diǎn),將當(dāng)前節(jié)點(diǎn)push到空數(shù)組。

functionflatten1(tree){

vararr=[];

functionspread(tree,pid){

for(vari=0;itree.length;i++){

item=tree[i]

let{id,name}=item;

arr.push({id,name,pid})

if(item.children){

spread(item.children,item.id)

deleteitem.children

spread(tree,0)

returnarr;

varnewArr=flatten1(tree);

思路二:

functionflatten2(data,pid){

returndata.reduce((arr,{id,name,children=[]})=

arr.concat([{id,name,pid}],flatten2(children,id)),[])

varnewArr=flatten2(tree,0);

結(jié)果:

3、如何將數(shù)組結(jié)構(gòu)轉(zhuǎn)換為樹形結(jié)構(gòu)?

下面是偶然看到一位大佬很秀的寫法(原文鏈接)

functiontreeData(data){

letcloneData=JSON.parse(JSON.stringify(data))

returncloneData.filter(parent={

letbranchArr=cloneData.filter(child=parent['id']==child['pid']);

branchArr.length0parent['children']=branchArr:'';

returnparent['pid']==0;

}

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論