数组 --> 🌲树
interface Item {
id: number;
parentId: number;
name: string;
}
interface TreeNode {
id: number;
name: string;
children: TreeNode[];
}
function arr2tree(arr: Item[]) {
const hash = new Map<number, TreeNode>();
let root;
arr.forEach((item) => {
const { id, parentId, name } = item;
const node: TreeNode = { id, name, children: [] };
hash.set(id, node);
if (parentId === 0) {
root = node;
}
const parent = hash.get(parentId);
if (parent) {
parent.children.push(node);
}
});
return root;
}
测试
const arr = [
{ id: 1, name: "部门A", parentId: 0 }, // 0 代表顶级节点,无父节点
{ id: 2, name: "部门B", parentId: 1 },
{ id: 3, name: "部门C", parentId: 1 },
{ id: 4, name: "部门D", parentId: 2 },
{ id: 5, name: "部门E", parentId: 2 },
{ id: 6, name: "部门F", parentId: 3 },
];
const tree = arr2tree(arr);
console.info(tree);
树🌲 --> 数组
- 将树拍平变成数组, 使用广度优先遍历🌲
interface Item {
id: number;
parentId: number;
name: string;
}
interface TreeNode {
id: number;
name: string;
children?: TreeNode[];
}
function tree2arr(root: TreeNode) {
const arr: Item[] = [];
const hash = new Map(); // child: father
hash.set(root, { id: 0 });
breadthForEach(root, (node) => {
node.children?.forEach((child) => {
const father = node;
hash.set(child, father);
});
const { id, name } = node;
const parentId = hash.get(node).id;
const item = { id, name, parentId };
arr.push(item);
});
return arr;
}
type CB = (node: TreeNode) => void;
// 广度优先
function breadthForEach(root: TreeNode, cb: CB) {
const arr: TreeNode[] = [root];
while (arr.length) {
const node = arr.pop();
if (node) cb(node);
if (node?.children?.length) {
node.children.forEach((item) => arr.unshift(item));
}
}
}
测试
const obj: TreeNode = {
id: 1,
name: "部门A",
children: [
{
id: 2,
name: "部门B",
children: [
{ id: 4, name: "部门D" },
{ id: 5, name: "部门E" },
],
},
{
id: 3,
name: "部门C",
children: [{ id: 6, name: "部门F" }],
},
],
};
const arr1 = tree2arr(obj);
console.info(arr1);
// [
// {id: 1, name: '部门A', parentId: 0},
// {id: 2, name: '部门B', parentId: 1},
// {id: 3, name: '部门C', parentId: 1},
// {id: 4, name: '部门D', parentId: 2},
// {id: 5, name: '部门E', parentId: 2},
// {id: 6, name: '部门F', parentId: 3},
// ]