list 转 tree 结构解法案例
list 用例
const treesArr = [
{ id: 16, parentId: 0 },
{ id: 17, parentId: 0 },
{ id: 18, parentId: 16 },
{ id: 19, parentId: 18 },
{ id: 21, parentId: 19 },
{ id: 22, parentId: 21 },
{ id: 23, parentId: 17 },
{ id: 24, parentId: 17 },
]
解法1
/**
* @method treesArrToObj 树形数组转化为 object 形式
* @param {Arrary} treesArr 树形数组
* @param {Object} treesObj 原始树形结构
* @return {Object} 树结构
*/
function treesArrToObj(treesArr = [], treesObj = {}) {
if (!treesArr.length) {
return treesObj;
}
// treesObj 不传或为空对象都视为初始化
if (!Object.keys(treesObj).length) {
treesObj.id = Math.min(...treesArr.map(({ parentId }) => parentId));
}
const children = treesArr.filter((item, index) => {
if (item.parentId === treesObj.id) {
// 用过的都清除掉,防止每次递归的时候都要遍历所有元素
delete treesArr[index];
return item.parentId === treesObj.id;
}
})
if (!children.length) {
return treesObj;
}
treesObj.children = children;
// 再次传递的 treesArr 是没用过的
treesObj.children.map(item => treesArrToObj(treesArr.filter(item => !!item), item));
return treesObj;
}