1.平面数组转树形数组
工作中,经常会用到平面数组转树形数组,树形转平面的数组,每次遇到一个项目,都要写一次很麻烦,直接写个通用函数,调用传参直接使用即可。
函数如下:
function planeToTree(planeList, parentId = null, idKey = 'id', parentKey = 'parentId', childrenKey = 'children') {
const treeList = []
for (let i = 0; i < planeList.length; i++) {
const node = planeList[i]
if (node[parentKey] === parentId) {
const children = planeToTree(planeList, node[idKey], idKey, parentKey, childrenKey)
if (children.length > 0) {
node[childrenKey] = children
}
treeList.push(node)
}
}
return treeList
}
传参解释:
planeList 参数表示待转换的平面数据列表;
parentId 参数表示当前节点的父级节点 ID,默认为 null;
idKey 和 parentKey 分别表示节点 ID 和父级节点 ID 在数据中的属性名,默认分别为 'id' 和 'parentId';
childrenKey 表示子节点在数据中的属性名,默认为 'children'。
举个例子:
let arr = [
{
"deptId": 1,
"parentId": 0,
"deptName": "总公司",
},
{
"deptId": 2,
"parentId": 1,
"deptName": "合肥总公司",
},
{
"deptId": 3,
"parentId": 1,
"deptName": "南京分公司",
},
{
"deptId": 4,
"parentId": 2,
"deptName": "研发部门",
},
{
"deptId": 5,
"parentId": 2,
"deptName": "市场部门",
},
{
"deptId": 6,
"parentId": 2,
"deptName": "生产1部",
},
{
"deptId": 7,
"parentId": 2,
"deptName": "生产2部",
},
{
"deptId": 8,
"parentId": 2,
"deptName": "运维部门",
},
{
"deptId": 9,
"parentId": 3,
"deptName": "市场部门",
},
{
"deptId": 10,
"parentId": 3,
"deptName": "财务部门",
}
]
console.log(planeToTree(arr, 0, 'deptId', 'parentId', 'children'))
2.树形数组转平面数组
函数如下:
function flattenTree(tree, key = 'id', childrenKey = 'children', parentId = null) {
return tree.reduce((acc, node) => {
const newNode = { ...node };
newNode.parentId = parentId;
acc.push(newNode);
if (newNode[childrenKey]) {
const children = flattenTree(newNode[childrenKey], key, childrenKey, newNode[key]);
acc.push(...children);
delete newNode[childrenKey];
}
return acc;
}, []);
}
传参解释:
tree:要转换为平面结构的树状结构数组。
key(可选):树中每个节点的唯一标识符属性名称。默认为 'id'。
childrenKey(可选):树中每个节点下一级子节点的属性名称。默认为 'children'。
parentId(可选):父节点的唯一标识符。默认为 null。
举个例子:
let arr = [
{
"id": 1,
"parentId": 0,
"label": "总公司",
"child": [
{
"id": 2,
"parentId": 1,
"label": "南京分公司",
"child": [
{
"id": 4,
"parentId": 2,
"label": "研发部门"
},
{
"id": 5,
"parentId": 2,
"label": "市场部门"
},
{
"id": 6,
"parentId": 2,
"label": "生产1部"
},
{
"id": 7,
"parentId": 2,
"label": "生产2部"
},
{
"id": 8,
"parentId": 2,
"label": "运维部门"
}
]
},
{
"id": 3,
"parentId": 1,
"label": "苏州分公司",
"child": [
{
"id": 9,
"parentId": 3,
"label": "市场部门"
},
{
"id": 10,
"parentId": 3,
"label": "财务部门"
}
]
}
]
}
]
console.log(flattenTree(arr, 'id', 'child', 0))