JS工作中多層不固定巢狀tree樹形節點的資料結構資料的整理

工作中經常會遇到後端介面返回的資料是這樣的,list/Map結構,多層不固定巢狀,類似tree樹形節點的資料結構:

var data = [ { categoryId: 2, categoryName: “服裝”, child: [], parentId: 9, sort: 1 }, { categoryId: 2, categoryName: “汽車”, child: [ { categoryId: 2, categoryName: “賓士”, child: [ { categoryId: 2, categoryName: “S600”, child: [ { categoryId: 201, categoryName: “G601”, child: [], parentId: 9, sort: 1 }, { categoryId: 202, categoryName: “G602”, child: [ { categoryId: 203, categoryName: “G603”, child: [ { categoryId: 204, categoryName: “G604”, child: [], parentId: 94, sort: 14 }, { categoryId: 205, categoryName: “G605”, child: [], parentId: 95, sort: 15 } ], parentId: 9, sort: 1 } ], parentId: 9, sort: 1 } ], parentId: 9, sort: 1 }, { categoryId: 2, categoryName: “G63”, child: [], parentId: 9, sort: 1 }, { categoryId: 2, categoryName: “S500”, child: [], parentId: 9, sort: 1 } ], parentId: 9, sort: 1 } ], parentId: 9, sort: 1 }, { categoryId: 2, categoryName: “數碼”, child: [], parentId: 9, sort: 1 }]

但其實,很多情況,前端結合一些ant-design、element-ui等UI框架的一些元件進行資料渲染時候,可能需要特殊處理後端返回的一些資料的結構,比如過濾掉child:[]是空的情況、categoryName名字改為label、categoryId改為value,其餘的欄位名稱可有可無可處理也可不處理。這個時候,一般會怎麼處理呢?可能比較容易想到的就是一層一層的for、 forEach等迴圈來判斷,但其實這樣寫起來程式碼冗餘,而且如果是很多層的child巢狀,就很麻煩。

下面可以換一種方式,採取一種遞迴的思想來處理這種場景需求:

function recursionMapData(arr){ // 如果是一個數組物件 if (Array。isArray(arr)) { if (!arr || !arr。length) return arr return arr。map(item => { let {categoryId, categoryName, child, 。。。a} = item return {value: categoryId, label: categoryName, children: child。map(recursionMapData), 。。。a} }) } else { // 如果是child->map迴圈,這裡就是child數組裡面的每一項item了,就是一個json物件了 let {categoryId, categoryName, child, 。。。a} = arr return {value: categoryId, label: categoryName, children: child。map(recursionMapData), 。。。a} }}

可以打印出經過recursionMapData方法整理之後的資料,發現就處理好了。

這樣程式碼更簡潔,可閱讀性好。有更好的處理方式,歡迎分享哦!