js實(shí)現(xiàn)單層數(shù)組轉(zhuǎn)多層樹
js單層數(shù)組轉(zhuǎn)多層樹
在很多場(chǎng)景下由于區(qū)分授權(quán),比如菜單或組織機(jī)構(gòu)等,給當(dāng)前用戶返回的往往可能不是以固定的父id來標(biāo)識(shí)數(shù)據(jù)的根節(jié)點(diǎn)。
這種情況下就需要?jiǎng)討B(tài)的根據(jù)當(dāng)前數(shù)組本身自動(dòng)判斷構(gòu)造樹。
理論就是根據(jù)父id,在數(shù)組或樹中查找,如果在元素中找到對(duì)應(yīng)id,那么就追加為子元素。
如果找不到,那當(dāng)前元素就是定級(jí)元素。
/** * 列表轉(zhuǎn)為樹,pid值未知。思路:第一遍遍歷構(gòu)造為map,第二遍 * @param {*} list * @returns */ export function listToTree(list) { let treeData = [] // 第一次遍歷,構(gòu)造一個(gè)map let tmpObj = {} list.forEach(item => { // 這里也可以把值設(shè)置為數(shù)組的索引,這樣的話在這里可以不必存儲(chǔ)這么大空間了 tmpObj[item.id] = item }); list.forEach(v => { const parent = tmpObj[v.parentId] // 如果有parentId并且在臨時(shí)map中存在 if (v.parentId && parent) { // 那么把當(dāng)前元素追加到目標(biāo)元素children之內(nèi),并且把當(dāng)前key刪除 if (!parent.children) { parent.children = [] } parent.children.push(v) } else { treeData.push(v) } }) // 再遍歷,根據(jù)pid在map中找是否有key,如果有,說明是上級(jí),那么追加到children中;如果沒有,那么就跳過,表示沒有上級(jí) return treeData; }
js一維(無嵌套單層)數(shù)組轉(zhuǎn)樹結(jié)構(gòu)數(shù)組(多維嵌套數(shù)組)
適用elementui(tree),根據(jù)項(xiàng)中的項(xiàng)的parentId與其他項(xiàng)中的id比較,相同,則將這個(gè)項(xiàng)添加到對(duì)應(yīng)的id項(xiàng)中
有一維數(shù)組如
想要等到以下的數(shù)據(jù)格式
先循環(huán)出祖先級(jí)的項(xiàng),再根據(jù)id與parentId,遞歸獲得最終數(shù)據(jù):
let newArray = []; arr.forEach(res => { if(res.parentId === 0) { newArray.push(res); } }); this.arrToTree(arr, newArray) ; console.log(newArray); // 最終得到的新數(shù)組; function arrToTree(list, arr) { arr.forEach(res => { list.forEach((ret, index) => { if(res.id === ret.parentId) { if(!res.hasOwnProperty('children')){ res.children = []; }; res.children.push(ret); } }) if(res.hasOwnProperty('children')) { this.arrToTree(list, res.children); } }) }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
js+css簡(jiǎn)單實(shí)現(xiàn)網(wǎng)頁換膚效果
這篇文章主要介紹了js+css簡(jiǎn)單實(shí)現(xiàn)網(wǎng)頁換膚效果的方法,涉及JavaScript響應(yīng)鼠標(biāo)事件動(dòng)態(tài)遍歷及修改頁面元素樣式的相關(guān)技巧,需要的朋友可以參考下2015-12-12JavaScript實(shí)現(xiàn)多個(gè)物體同時(shí)運(yùn)動(dòng)
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)多個(gè)物體同時(shí)運(yùn)動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03純JavaScript實(shí)現(xiàn)獲取onclick、onchange等事件的值
這篇文章主要介紹了JavaScript獲取onclick、onchange等事件的值的方法,需要的朋友可以參考下2014-12-12JavaScript箭頭函數(shù)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了JavaScript箭頭函數(shù)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06JavaScript控制網(wǎng)頁層收起和展開效果的方法
這篇文章主要介紹了JavaScript控制網(wǎng)頁層收起和展開效果的方法,涉及javascript操作網(wǎng)頁元素動(dòng)態(tài)效果的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04原生JavaScript實(shí)現(xiàn)滑動(dòng)拖動(dòng)驗(yàn)證的示例代碼
這篇文章主要介紹了原生JavaScript實(shí)現(xiàn)滑動(dòng)拖動(dòng)驗(yàn)證的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12JavaScript實(shí)現(xiàn)表單注冊(cè)、表單驗(yàn)證、運(yùn)算符功能
在本篇文章里我們給大家整理了關(guān)于JavaScript中表單注冊(cè)、表單驗(yàn)證、運(yùn)算符的代碼示例,有興趣的朋友們可以測(cè)試學(xué)習(xí)下。2018-10-10JS實(shí)現(xiàn)unicode和UTF-8之間的互相轉(zhuǎn)換互轉(zhuǎn)
需要將PC送過來的UTF-8轉(zhuǎn)換成UNICODE才能將內(nèi)容通過短信發(fā)送出去,同樣,接收到的短信為unicode編碼,也許轉(zhuǎn)換成UTF-8才能在PC端軟件顯示出來2017-07-07