JavaScript如何將數(shù)據(jù)處理成樹形結(jié)構(gòu)
JavaScript將數(shù)據(jù)處理成樹形結(jié)構(gòu)
第一個方法是使用遞歸
可以處理多層嵌套。
(react的value值和key值不一樣是會報錯的,而且key值要唯一,如果這組數(shù)據(jù)需要帶有搜索功能的話是要設(shè)置treeNodeFilterProp來指定根據(jù)哪個字段來搜索的)。
如果傳進來的數(shù)據(jù)保證是有字段的可以省略判斷的步驟,遞歸這個方法也可以結(jié)合第二個方法讓代碼看起來更簡潔。
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;
}第二個方法是直接遍歷
只能處理一層嵌套,但是要比遞歸簡單,由于react可以只設(shè)置value和key其中一個,在這個方法中就不特別增加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將平級數(shù)據(jù)轉(zhuǎn)換成樹形結(jié)構(gòu)數(shù)據(jù)
從數(shù)據(jù)庫查詢的每一條數(shù)據(jù)都包含id 和pid 字段,將獲得的數(shù)據(jù)轉(zhuǎn)換成樹形結(jié)構(gòu)
id 與 pid 的關(guān)系 ===> pid 等于0 的是最外層數(shù)據(jù), pid 等于最外層 數(shù)據(jù)的id,將這條數(shù)據(jù)放在第二層,
不確定有多少層,理論上可以有無數(shù)層,循環(huán)數(shù)據(jù)變成樹形結(jié)構(gòu):

// 數(shù)據(jù)循環(huán)
levelLoop(arr) {
const returnArr = []; // 返回的數(shù)組
let levelArr = []; // 當前層級的數(shù)組
let lastLevelArr = []; // 上一層數(shù)組
let idLevleArr = []; // 當前層級id的數(shù)組
let lastIdLevleArr = []; // 上一層級id的數(shù)組
let indexLevelArr = []; // 當前層級索引的數(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); // 添加到最前面,遍歷刪除元素時從后面開始刪除,不會影響index的位置
} else {
const lastIndex = lastIdLevleArr.indexOf(curItem.pid);
if (lastIndex > -1) {
// 屬于上一層級的子級
// 如果上一層級沒有child則添加該屬性,此時添加是保證有子元素指向上一層級才添加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); // 刪除當前層級的元素,使總數(shù)量不斷減少
});
indexLevelArr = [];
if (curArr.length) {
return curLoop(curArr);
} else {
return returnArr;
}
}
}
},

總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
JS 截取字符串substr 和 substring方法的區(qū)別
JS 截取字符串substr 和 substring方法的區(qū)別,需要的朋友可以參考下,根據(jù)需要自行選擇。2009-10-10
在線編輯器的實現(xiàn)原理(兼容IE和FireFox)
在線編輯器的實現(xiàn)原理(兼容IE和FireFox)...2007-03-03

