




下載本文檔
版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 耳目一新2025年主管護(hù)師考試試題及答案
- 主管護(hù)師考試經(jīng)驗(yàn)交流試題及答案
- 實(shí)戰(zhàn)模擬執(zhí)業(yè)藥師考試練習(xí)試題及答案
- 護(hù)理專業(yè)新舊考點(diǎn)對比研究試題及答案
- 自考行政管理社會評估試題及答案
- 2025年執(zhí)業(yè)醫(yī)師考試國際標(biāo)準(zhǔn)對比試題及答案
- 護(hù)理學(xué)科綜合素養(yǎng)考核題及答案2025年
- 行政管理??乒卜?wù)監(jiān)測試題及答案
- 護(hù)理服務(wù)質(zhì)量提升試題及答案總結(jié)
- 行政管理培訓(xùn)考試試題發(fā)布及答案
- 生物柴油項(xiàng)目申報(bào)材料范文模板 (一)
- 豬保價(jià)合同協(xié)議
- 玉石代理銷售合同協(xié)議
- (二模)2025年汕頭市高三普通高考第二次模擬考試英語試卷(含答案)
- 山東2025年山東省公共衛(wèi)生臨床中心招聘博士人才60筆試歷年參考題庫附帶答案詳解
- 2024年臺州市委統(tǒng)戰(zhàn)部下屬事業(yè)單位選聘筆試真題
- 山西太原事業(yè)單位考試《行測》模擬題帶答案2024年
- 2025年中考英語第一次模擬考試(蘇州卷)(原卷版)
- 福州一號線盾構(gòu)法地鐵工程整體施工組織設(shè)計(jì)
- 公務(wù)員考試-經(jīng)濟(jì)基礎(chǔ)知識模擬題-計(jì)量經(jīng)濟(jì)學(xué)-協(xié)整與誤差修正模型
- 資源與運(yùn)營管理-第一次形考任務(wù)-國開-參考資料
評論
0/150
提交評論