繁体   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