[英]How to flatten a tree with 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’,
}
]
}
Output:
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’,
}
....
]
有人可以告訴我如何為 function 編寫正確的類型嗎?
雖然 output 沒有children
的屬性值,但我不想在代碼中as any as xxx
。
有人可以告訴我如何為 function 編寫正確的類型嗎?
雖然 output 沒有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
*/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.