typescript - 如何使用 TypeScript 展平一棵树
问题描述
我有这个 TypeScript 代码:
function flattenTree <T, K extends keyof T>(tree: T, key: K): T[] {
const flattedTree = {
...tree,
};
delete flattedTree[key];
if (Array.isArray(tree[key]) && (tree[key] as any as T[]).length > 0) {
return [flattedTree].concat(
(tree[key] as any as T[]).map(child => flattenTree(child, key))
.reduce((pre, next) => pre.concat(next)),
);
}
return [flattedTree];
}
输入:
interface ShopTree {
shopId: string;
name: string;
nodeType: string;
children: ShopTree[];
}
const testObj: ShopTree = {
shopId: '123',
name: 'KFC(root)',
nodeType: 'ROOT‘,
children: [
{
shopId: '23',
name: 'KFC(middle)',
nodeType: 'MIDDLE',
children: [{
shopId: '45',
name: 'KFC(leafA)',
nodeType: 'LEAF’,
}]
},
{
shopId: '234',
name: 'KFC(leafB)',
nodeType: 'LEAF’,
}
]
}
输出:
console.log('result', flattenTree(testObj))
[
{
shopId: '123',
name: 'KFC(root)',
nodeType: 'ROOT‘,
},
{
shopId: '23',
name: 'KFC(middle)',
nodeType: 'MIDDLE',
},
{
shopId: '45',
name: 'KFC(leafA)',
nodeType: 'LEAF’,
}
....
]
有人可以告诉我如何为函数编写正确的类型吗?
虽然输出没有属性值,children
我不想as any as xxx
在代码中使用。
有人可以告诉我如何为函数编写正确的类型吗?
虽然输出没有属性值,children
我不想as any as xxx
在代码中使用。
解决方案
如果不了解您的树的结构,提供任何更精确的帮助有点困难。这是该类型的外观示例:
const flattenTree = <T>(tree: INode<T> | null): T[] => tree === null
? []
: [tree.value, ...flattenTree(tree.left), ...flattenTree(tree.right)]
一棵扁平的<T>
回报树T[]
这是一个完整的示例,说明如何使树变平:
interface INode<T> {
left: INode<T> | null;
right: INode<T> | null;
value: T;
}
const flattenTree = <T>(tree: INode<T> | null): T[] => tree === null
? []
: [tree.value, ...flattenTree(tree.left), ...flattenTree(tree.right)]
const testTree: INode<number> = {
left: {
left: null,
right: {
left: null,
right: {
left: null,
right: null,
value: 7,
},
value: 5,
},
value: 3,
},
right: {
right: {
left: {
left: null,
right: null,
value: 0,
},
right: null,
value: 9,
},
left: {
right: null,
left: null,
value: 1,
},
value: 10,
},
value: 2,
};
const result = flattenTree(testTree);
console.log(result);
/* gives:
0: 2
1: 3
2: 5
3: 7
4: 10
5: 1
6: 9
7: 0
*/
推荐阅读
- javascript - JQuery如何遍历多个JSON文件来构建测验
- java - Jackson 将所有属性编码为 base64
- php - 获取在同一会话中使用 rest api 创建的元素的 id
- sql - SQL Server:与服务器建立连接成功,但登录过程中出现错误
- android - 调试 Android 应用内更新的最佳实践
- google-maps - 如何将 Google 地球与我的网站连接起来?
- python - 输出三个 nxn 表
- sqlite - 如何将 sqlite3 db 文件存储在二进制文件中
- c# - dotnet 格式不保存输出
- c - Shmget 错误,大小大于 4 时参数无效