1. 程式人生 > 實用技巧 >js遞迴遍歷樹結構

js遞迴遍歷樹結構

JS遞迴遍歷樹結構

先展示一波資料,當然通常的專案id都是為string型別的,我這裡也是比較懶,所以直接少寫了一些''

`const a= [ { id:1, name:"第一節", children:[{ id:1.1, name:"第二節", children:[{ id:1.11, name:"第三節" },{ id:1.12, name:"第三的隔壁", }] }] },{ id:2, name:"第一節", children:[{ id:2.1, name:"第二節", children:[{ id:2.11, name:"第三節" }] }] } ]`

![](https://img2020.cnblogs.com/blog/2237921/202012/2237921-20201208104635635-2135243123.png)

專案需求是分別返回單獨省市縣大概如下:

![](https://img2020.cnblogs.com/blog/2237921/202012/2237921-20201208104635635-2135243123.png)

首先後端給的資料中並沒有包含父級id,即parentId,所以我這裡需要自己新增,因為比較懶所以測試中的par即parentId,par的值是根據上一級id累加,如果沒有上一級,那麼par的值為0,程式碼如下

`a && a.map((item,index) => { item.par='0' item.children && checkChild(item.children, item.par+','+item.id); }) function checkChild(child,parentId) { child.map((item,index) => { //pre為字串型別 item.par = String(parentId) item.children && checkChild(item.children, item.par+','+item.id); }) } console.log(a)`

通過返回一個新的陣列,得到的陣列為下

![](https://img2020.cnblogs.com/blog/2237921/202012/2237921-20201208110136593-294608545.png)

接著some方法來依次執行陣列,判斷是否有children,接著根據父級id的length來判斷是第幾層,程式碼如下

`const checkItem= [ 2,2.1,2.11,1.1,1.11 ] const findChild = (arr = [], value) => { let result = {};

function flatten(list = [], value) {
    list.some(item => {
        if (item.id === value) {
            result = item;
            return true
        }
        flatten(item.children, value);
    });
}

flatten(arr, value);
return result

};
let result = checkItem.reduce((t, v, i) => {
let value = findChild(a,v);
let isParent=value&&value.par.split(',').filter(v=>parseFloat(v))
console.log(value)
t[isParent.length]= t[isParent.length] || []
t[isParent.length].push(value.id)
return t
}, []);
console.log(result)`

這樣就可以得到最上面圖片中的值了