🌲树<---转--->数组

47 阅读1分钟

数组 --> 🌲树

interface Item {
  id: number;
  parentId: number;
  name: string;
}

interface TreeNode {
  id: number;
  name: string;
  children: TreeNode[];
}

function arr2tree(arr: Item[]) {
  const hash = new Map<number, TreeNode>();
  let root;

  arr.forEach((item) => {
    const { id, parentId, name } = item;
    const node: TreeNode = { id, name, children: [] };
    hash.set(id, node);

    if (parentId === 0) {
      root = node;
    }

    const parent = hash.get(parentId);
    if (parent) {
      parent.children.push(node);
    }
  });

  return root;
}

测试

const arr = [
  { id: 1, name: "部门A", parentId: 0 }, // 0 代表顶级节点,无父节点
  { id: 2, name: "部门B", parentId: 1 },
  { id: 3, name: "部门C", parentId: 1 },
  { id: 4, name: "部门D", parentId: 2 },
  { id: 5, name: "部门E", parentId: 2 },
  { id: 6, name: "部门F", parentId: 3 },
];
const tree = arr2tree(arr);
console.info(tree);

树🌲 --> 数组

  • 将树拍平变成数组, 使用广度优先遍历🌲
interface Item {
  id: number;
  parentId: number;
  name: string;
}

interface TreeNode {
  id: number;
  name: string;
  children?: TreeNode[];
}

function tree2arr(root: TreeNode) {
  const arr: Item[] = [];
  const hash = new Map(); // child: father
  hash.set(root, { id: 0 });

  breadthForEach(root, (node) => {
    node.children?.forEach((child) => {
      const father = node;
      hash.set(child, father);
    });

    const { id, name } = node;
    const parentId = hash.get(node).id;
    const item = { id, name, parentId };
    arr.push(item);
  });

  return arr;
}

type CB = (node: TreeNode) => void;

// 广度优先
function breadthForEach(root: TreeNode, cb: CB) {
  const arr: TreeNode[] = [root];

  while (arr.length) {
    const node = arr.pop();
    if (node) cb(node);
    if (node?.children?.length) {
      node.children.forEach((item) => arr.unshift(item));
    }
  }
}

测试

const obj: TreeNode = {
  id: 1,
  name: "部门A",
  children: [
    {
      id: 2,
      name: "部门B",
      children: [
        { id: 4, name: "部门D" },
        { id: 5, name: "部门E" },
      ],
    },
    {
      id: 3,
      name: "部门C",
      children: [{ id: 6, name: "部门F" }],
    },
  ],
};
const arr1 = tree2arr(obj);
console.info(arr1);


// [
//   {id: 1, name: '部门A', parentId: 0},
//   {id: 2, name: '部门B', parentId: 1},
//   {id: 3, name: '部门C', parentId: 1},
//   {id: 4, name: '部门D', parentId: 2},
//   {id: 5, name: '部门E', parentId: 2},
//   {id: 6, name: '部门F', parentId: 3},
// ]