如何將JavaScript將數(shù)組轉(zhuǎn)為樹形結(jié)構(gòu)
1.需求
后臺(tái)給了一個(gè)這樣的數(shù)據(jù)讓咱前端去轉(zhuǎn)換為樹形結(jié)構(gòu)(沒(méi)有重復(fù)數(shù)據(jù))。不多說(shuō),先來(lái)看看給了一個(gè)怎樣的數(shù)組數(shù)據(jù),轉(zhuǎn)換為怎樣的樹形結(jié)構(gòu)。
服務(wù)器傳過(guò)來(lái)的數(shù)組
const arr = [
[
{"deptId":"D019",
"deptName":"銷售部"},
{"deptId":"D019101",
"deptName":"華北銷售中心"}
],[
{"deptId":"D083",
"deptName":"音樂(lè)事業(yè)部"}
],[
{"deptId":"D027",
"deptName":"杭州研究院"},
{"deptId":"D027048",
"deptName":"技術(shù)工程事業(yè)部"},
{"deptId":"D027048002",
"deptName":"項(xiàng)目管理中心"}
],[
{"deptId":"D027",
"deptName":"杭州研究院"},
{"deptId":"D027048",
"deptName":"技術(shù)工程事業(yè)部"}
],[
{"deptId":"D027",
"deptName":"杭州研究院"},
{"deptId":"D027048",
"deptName":"技術(shù)工程事業(yè)部"}
]
]
最終轉(zhuǎn)換為
const arr = [
{
deptId: 'D019',
deptName: '銷售部',
children: [{
deptId: 'D019101',
deptName: '華北銷售中心',
children: [],
}]
},
{
deptId: 'D083',
deptName: '音樂(lè)事業(yè)部',
children: []
},
{
deptId: 'D027',
deptName: '杭州研究院',
children: [{
deptId: 'D027048',
deptName: '技術(shù)工程事業(yè)部',
children: [{
deptId: 'D027048002',
deptName: '項(xiàng)目管理中心',
children: []
}]
}]
},
]
2.上代碼(在reactHooks中開發(fā))
const [treeData, setTreeData] = useState([]);
console.log(treeData); //treeData為最終需要的樹形結(jié)構(gòu),(在我本地瀏覽器打印出來(lái)是正確的)
useEffect(() => {
const str = '[[{"deptId":"D019","deptName":"銷售部"},{"deptId":"D019101","deptName":"華北銷售中心"}],[{"deptId":"D019","deptName":"銷售部"},{"deptId":"D019101","deptName":"華北銷售中心"}],[{"deptId":"D083","deptName":"音樂(lè)事業(yè)部"}],[{"deptId":"D027","deptName":"杭州研究院"},{"deptId":"D027048","deptName":"技術(shù)工程事業(yè)部"},{"deptId":"D027048002","deptName":"項(xiàng)目管理與效能中心"}],[{"deptId":"D027","deptName":"杭州研究院"},{"deptId":"D027048","deptName":"技術(shù)工程事業(yè)部"}],[{"deptId":"D027","deptName":"杭州研究院"},{"deptId":"D027048","deptName":"技術(shù)工程事業(yè)部"}]]';
const arr = JSON.parse(str).flat(); //扁平化
let newArr = [];
noRepeat(arr).length && noRepeat(arr).forEach(it => {
appendChild(it, newArr);
});
}, [])
const noRepeat = (arr) => { //去重
let newobj = {};
return arr.reduce((preVal, curVal) => {
newobj[curVal.deptId] ? '' : newobj[curVal.deptId] = preVal.push(curVal);
return preVal
}, []);
}
const appendChild = (item, newArr) => {
if(!newArr.find(it => item.deptId.indexOf(it.deptId) > -1)) { //所有一級(jí)部門
newArr.push({
deptId: item.deptId,
deptName: item.deptName,
children: [],
});
setTreeData(newArr);
}else {
appendOtherChild(item, newArr);
}
}
const appendOtherChild = (item, newArr) => {
newArr.map(it => {
if(item.deptId.indexOf(it.deptId) > -1 && item.deptId.length === it.deptId.length+3) {
it.children.push({
deptId: item.deptId,
deptName: item.deptName,
children: [],
})
}else {
appendOtherChild(item, it.children);
}
});
setTreeData(newArr);
}
總結(jié)
可能這些數(shù)據(jù)和你的不太一樣,但是邏輯可能八九不離十,可以好好看一下這幾十行代碼
到此這篇關(guān)于如何將JavaScript將數(shù)組轉(zhuǎn)為樹形結(jié)構(gòu)的文章就介紹到這了,更多相關(guān)JavaScript數(shù)組轉(zhuǎn)為樹形結(jié)構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- JavaScript樹形結(jié)構(gòu)數(shù)組處理之遞歸問(wèn)題
- JS前端二維數(shù)組生成樹形結(jié)構(gòu)示例詳解
- JavaScript數(shù)組扁平轉(zhuǎn)樹形結(jié)構(gòu)數(shù)據(jù)(Tree)的實(shí)現(xiàn)
- JS實(shí)現(xiàn)樹形結(jié)構(gòu)與數(shù)組結(jié)構(gòu)相互轉(zhuǎn)換并在樹形結(jié)構(gòu)中查找對(duì)象
- JavaScript平鋪數(shù)組轉(zhuǎn)樹形結(jié)構(gòu)的實(shí)現(xiàn)示例
- JavaScript 實(shí)現(xiàn)普通數(shù)組數(shù)據(jù)轉(zhuǎn)化為樹形數(shù)據(jù)結(jié)構(gòu)的步驟說(shuō)明
相關(guān)文章
js創(chuàng)建對(duì)象幾種方式的優(yōu)缺點(diǎn)對(duì)比
這篇文章主要對(duì)比了js創(chuàng)建對(duì)象幾種方式的優(yōu)缺點(diǎn),感興趣的小伙伴們可以參考一下2016-09-09
JS鼠標(biāo)滑過(guò)圖片時(shí)切換圖片實(shí)現(xiàn)思路
在瀏覽網(wǎng)頁(yè)時(shí)會(huì)看到這樣的效果:當(dāng)鼠標(biāo)滑過(guò)一張圖片后,這張圖片切換為了另外的一張圖片,下面為大家介紹下具體是如何實(shí)現(xiàn)的,感興趣的朋友不要錯(cuò)過(guò)2013-09-09
javascript 拷貝節(jié)點(diǎn)cloneNode()使用介紹
這篇文章主要介紹了javascript 節(jié)點(diǎn)操作拷貝節(jié)點(diǎn)cloneNode()的使用,需要的朋友可以參考下2014-04-04
JS實(shí)現(xiàn)常用導(dǎo)航鼠標(biāo)下經(jīng)過(guò)下方橫線自動(dòng)跟隨效果
這篇文章主要介紹了JS寫常用導(dǎo)航鼠標(biāo)下經(jīng)過(guò)下方橫線自動(dòng)跟隨效果,文中還給大家講解了基于css?+?js?實(shí)現(xiàn)導(dǎo)航欄下劃線跟隨鼠標(biāo)滑動(dòng)效果,需要的朋友可以參考下2023-01-01
js使用split函數(shù)按照多個(gè)字符對(duì)字符串進(jìn)行分割的方法
這篇文章主要介紹了js使用split函數(shù)按照多個(gè)字符對(duì)字符串進(jìn)行分割的方法,實(shí)例分析了split函數(shù)的使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03
讓getElementsByName適應(yīng)IE和firefox的方法
讓getElementsByName適應(yīng)IE和firefox的方法...2007-09-09
js如何去除數(shù)組中的empty?undefined空項(xiàng)
這篇文章主要介紹了js如何去除數(shù)組中的empty?undefined空項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08

