簡體   English   中英

如何用 TypeScript 壓平一棵樹

[英]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
*/

Typescript 操場鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM