TS 实现平铺结构转化为树形结构

需求

要将给定的平铺结构的 Item 数组转换为树形结构的 ITreeItem,你可以使用递归的方法来构建树。

代码

以下是一个可能的 TypeScript 实现示例:

interface Item {
  id: string;
  name: string;
  childrenId?: string[];
  parentId?: string;
}

interface ITreeItem extends Item {
  children?: ITreeItem[]
}

function buildMenuTree(items: Item[], parentId?: string): ITreeItem[] {
  const tree: ITreeItem[] = [];

  for (const item of items) {
    if (item.parentId === parentId) {
      const treeItem: ITreeItem = {
        ...item,
        children: buildMenuTree(items, item.id)
      };
      tree.push(treeItem);
    }
  }

  return tree;
}

const flatMenu: Item[] = [

  {
    "id": "1",
    "name": 'vegetable'
  },
  {
    "id": "2",
    "name": 'fruit',
    "childrenId": [
      "3",
      "4"
    ]
  },
  {
    "id": "3",
    "name": 'banana',
    "parentId": "2"
  },
  {
    "id": "4",
    "name": 'apple',
    "parentId": "2"
  }
];

const menuTree: Item[] = buildMenuTree(flatMenu);

console.log(JSON.stringify(menuTree, null, 2)); // Output the menu tree structure

将代码粘贴到 https://www.typescriptlang.org/play 即可体验。

在这个示例中,buildMenuTree 函数接受一个平铺的 Item 数组和一个可选的 parentId 参数,然后递归地构建树形结构。对于每个项目,它检查项目的 parentId 是否匹配传入的 parentId,如果匹配则将项目添加到当前节点的 children 数组中。

你可以将你提供的示例数据放入 flatMenu 数组中,然后运行代码,它将输出树形结构的 menuTree。请注意,这只是一个示例实现,你可以根据需要进行调整。

评论