先给我生成一个平铺树形数组,key的字段是appName,是否根节点字段是isRoot,子节点数组是extendsList,然后使用ts写一个组装成树形结构的算法
时间: 2024-02-06 19:09:25 浏览: 23
好的,以下是生成平铺树形数组的示例代码:
```typescript
interface AppNode {
appName: string;
isRoot: boolean;
extendsList: string[];
}
const appNodes: AppNode[] = [
{ appName: 'A', isRoot: true, extendsList: ['B', 'C'] },
{ appName: 'B', isRoot: false, extendsList: ['D', 'E'] },
{ appName: 'C', isRoot: false, extendsList: ['F', 'G'] },
{ appName: 'D', isRoot: false, extendsList: [] },
{ appName: 'E', isRoot: false, extendsList: [] },
{ appName: 'F', isRoot: false, extendsList: [] },
{ appName: 'G', isRoot: false, extendsList: [] },
];
```
现在我们来写一个组装成树形结构的算法:
```typescript
interface TreeNode {
appName: string;
isRoot: boolean;
children?: TreeNode[];
}
function buildTree(appNodes: AppNode[]): TreeNode[] {
const map: { [key: string]: TreeNode } = {};
// 首先将所有节点转换成树节点,并以appName为键存入map中
appNodes.forEach((node) => {
map[node.appName] = { ...node, children: [] };
});
// 遍历一遍节点,将子节点添加到父节点的children数组中
appNodes.forEach((node) => {
node.extendsList.forEach((childName) => {
map[node.appName].children?.push(map[childName]);
});
});
// 最后返回所有根节点
return appNodes.filter((node) => node.isRoot).map((node) => map[node.appName]);
}
const tree = buildTree(appNodes);
console.log(tree);
```
这样就可以将平铺的数组组装成树形结构了。其中,我们使用了一个map对象来存储每个节点对象,以便在遍历时快速查找父节点和子节点。