先给我生成一个平铺树形数组,key的字段是appName,是否根节点字段是isRoot,子节点数组是extendsList,然后使用ts写一个组装成树形结构的算法
时间: 2024-02-06 09:09:13 浏览: 15
好的,下面是生成平铺树形数组的代码:
```typescript
interface AppNode {
appName: string;
isRoot: boolean;
extendsList?: string[];
}
const appList: AppNode[] = [
{ appName: 'A', isRoot: true },
{ appName: 'B', isRoot: false, extendsList: ['A'] },
{ appName: 'C', isRoot: false, extendsList: ['B'] },
{ appName: 'D', isRoot: false, extendsList: ['C'] },
{ appName: 'E', isRoot: true },
{ appName: 'F', isRoot: false, extendsList: ['E'] },
{ appName: 'G', isRoot: false, extendsList: ['F'] },
{ appName: 'H', isRoot: false, extendsList: ['G'] },
];
function generateFlatTree(appList: AppNode[]): AppNode[] {
const flatTree: AppNode[] = [];
appList.forEach((appNode) => {
flatTree.push(appNode);
if (appNode.extendsList) {
appNode.extendsList.forEach((childNode) => {
flatTree.push({ appName: childNode, isRoot: false });
});
}
});
return flatTree;
}
const flatTree = generateFlatTree(appList);
console.log(flatTree);
```
接下来是组装成树形结构的代码:
```typescript
interface TreeNode {
appName: string;
isRoot: boolean;
children?: TreeNode[];
}
function generateTree(flatTree: AppNode[]): TreeNode[] {
const tree: TreeNode[] = [];
const map: { [key: string]: TreeNode } = {};
flatTree.forEach((node) => {
const { appName, isRoot } = node;
const treeNode: TreeNode = { appName, isRoot };
if (isRoot) {
tree.push(treeNode);
}
map[appName] = treeNode;
});
flatTree.forEach((node) => {
const { appName, extendsList } = node;
if (extendsList) {
extendsList.forEach((childAppName) => {
const childNode = map[childAppName];
const parentNode = map[appName];
if (parentNode.children) {
parentNode.children.push(childNode);
} else {
parentNode.children = [childNode];
}
});
}
});
return tree;
}
const tree = generateTree(flatTree);
console.log(tree);
```
这样就可以将平铺的树形数组组装成树形结构了。