JavaScript如何將數(shù)據(jù)處理成樹(shù)形結(jié)構(gòu)
JavaScript將數(shù)據(jù)處理成樹(shù)形結(jié)構(gòu)
第一個(gè)方法是使用遞歸
可以處理多層嵌套。
(react的value值和key值不一樣是會(huì)報(bào)錯(cuò)的,而且key值要唯一,如果這組數(shù)據(jù)需要帶有搜索功能的話(huà)是要設(shè)置treeNodeFilterProp來(lái)指定根據(jù)哪個(gè)字段來(lái)搜索的)。
如果傳進(jìn)來(lái)的數(shù)據(jù)保證是有字段的可以省略判斷的步驟,遞歸這個(gè)方法也可以結(jié)合第二個(gè)方法讓代碼看起來(lái)更簡(jiǎn)潔。
function toTree(data) { ? ? for (let i = 0; i < data.length; i++) { ? ? ? data[i].value = data[i].id || ''; ? ? ? data[i].title = data[i].name || ''; ? ? ? data[i].key = data[i].id || ''; ? ? ? data[i].children = data[i].list || []; ? ? ? if (data[i].children && data[i].children.length > 0) { ? ? ? ? toTree(data[i].children); ? ? ? } ? ? } ? ? return data; }
第二個(gè)方法是直接遍歷
只能處理一層嵌套,但是要比遞歸簡(jiǎn)單,由于react可以只設(shè)置value和key其中一個(gè),在這個(gè)方法中就不特別增加key了。
function toTree(data) { ? ? return data.map((item) => { ? ? ? return { ? ? ? ? title: item.name, ? ? ? ? value: item.id, ? ? ? ? children: item.list.map((item1) => { ? ? ? ? ? return { ? ? ? ? ? ? title: item1.name, ? ? ? ? ? ? value: item1.id, ? ? ? ? ? }; ? ? ? ? }), ? ? ? }; ? ? }); }
根據(jù)id將平級(jí)數(shù)據(jù)轉(zhuǎn)換成樹(shù)形結(jié)構(gòu)數(shù)據(jù)
從數(shù)據(jù)庫(kù)查詢(xún)的每一條數(shù)據(jù)都包含id 和pid 字段,將獲得的數(shù)據(jù)轉(zhuǎn)換成樹(shù)形結(jié)構(gòu)
id 與 pid 的關(guān)系 ===> pid 等于0 的是最外層數(shù)據(jù), pid 等于最外層 數(shù)據(jù)的id,將這條數(shù)據(jù)放在第二層,
不確定有多少層,理論上可以有無(wú)數(shù)層,循環(huán)數(shù)據(jù)變成樹(shù)形結(jié)構(gòu):
// 數(shù)據(jù)循環(huán) levelLoop(arr) { const returnArr = []; // 返回的數(shù)組 let levelArr = []; // 當(dāng)前層級(jí)的數(shù)組 let lastLevelArr = []; // 上一層數(shù)組 let idLevleArr = []; // 當(dāng)前層級(jí)id的數(shù)組 let lastIdLevleArr = []; // 上一層級(jí)id的數(shù)組 let indexLevelArr = []; // 當(dāng)前層級(jí)索引的數(shù)組 return curLoop(arr); function curLoop(curArr) { curArr.forEach((curItem, curIndex) => { if (curItem.pid === 0) { // 最外層 returnArr.push(curItem); levelArr.push(curItem); idLevleArr.push(curItem.id); indexLevelArr.unshift(curIndex); // 添加到最前面,遍歷刪除元素時(shí)從后面開(kāi)始刪除,不會(huì)影響index的位置 } else { const lastIndex = lastIdLevleArr.indexOf(curItem.pid); if (lastIndex > -1) { // 屬于上一層級(jí)的子級(jí) // 如果上一層級(jí)沒(méi)有child則添加該屬性,此時(shí)添加是保證有子元素指向上一層級(jí)才添加child if (!lastLevelArr[lastIndex].children) { lastLevelArr[lastIndex].children = []; } levelArr.push(curItem); lastLevelArr[lastIndex].children.push(curItem); idLevleArr.push(curItem.id); indexLevelArr.unshift(curIndex); } } }); lastLevelArr = levelArr; levelArr = []; lastIdLevleArr = idLevleArr; idLevleArr = []; indexLevelArr.forEach(index => { curArr.splice(index, 1); // 刪除當(dāng)前層級(jí)的元素,使總數(shù)量不斷減少 }); indexLevelArr = []; if (curArr.length) { return curLoop(curArr); } else { return returnArr; } } } },
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
JS 截取字符串substr 和 substring方法的區(qū)別
JS 截取字符串substr 和 substring方法的區(qū)別,需要的朋友可以參考下,根據(jù)需要自行選擇。2009-10-10小程序測(cè)試后臺(tái)服務(wù)的方法(ngrok)
這篇文章主要介紹了小程序測(cè)試后臺(tái)服務(wù)的方法(ngrok),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03在線編輯器的實(shí)現(xiàn)原理(兼容IE和FireFox)
在線編輯器的實(shí)現(xiàn)原理(兼容IE和FireFox)...2007-03-03簡(jiǎn)單使用webpack打包文件的實(shí)現(xiàn)
這篇文章主要介紹了簡(jiǎn)單使用webpack打包文件的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10js閉包的6種應(yīng)用場(chǎng)景總結(jié)
如果一個(gè)函數(shù)訪問(wèn)了此函數(shù)的父級(jí)及父級(jí)以上的作用域變量,那么這個(gè)函數(shù)就是一個(gè)閉包,本文將給大家分享js閉包的6種應(yīng)用場(chǎng)景,文中有詳細(xì)的代碼示例,需要的朋友可以參考下2023-09-09