将一个数组转换为一棵树可以通过递归实现。假设我们有一个包含父节点与子节点关系的数组,如下所示:

const arr = [
    { id: 1, name: 'A', parent_id: null },
    { id: 2, name: 'B', parent_id: 1 },
    { id: 3, name: 'C', parent_id: 2 },
    { id: 4, name: 'D', parent_id: 1 },
    { id: 5, name: 'E', parent_id: 4 },
    { id: 6, name: 'F', parent_id: 3 },
];

现在我们要将这个数组转换为一棵树,我们需要做以下步骤:

  1. 遍历数组,找到根节点,即parent_idnull的节点,将它们保存在一个新数组中。
  2. 对于每个根节点,递归地查找它的子节点。
  3. 对于每个子节点,将它加入其父节点的children属性中。

下面是转换为树的实现代码:

function buildTree(arr, parent_id = null) {
  let tree = [];

  // 遍历数组,找到根节点
  arr.forEach(node => {
    if (node.parent_id === parent_id) {
      
      // 递归查找子节点
      const children = buildTree(arr, node.id);

      // 如果存在子节点,添加到父节点的 children 属性中
      if (children.length) {
        node.children = children;
      }

      // 将节点添加到树中
      tree.push(node);
    }
  });

  return tree;
}

const arr = [
  { id: 1, name: 'A', parent_id: null },
  { id: 2, name: 'B', parent_id: 1 },
  { id: 3, name: 'C', parent_id: 2 },
  { id: 4, name: 'D', parent_id: 1 },
  { id: 5, name: 'E', parent_id: 4 },
  { id: 6, name: 'F', parent_id: 3 },
];

const tree = buildTree(arr);

console.log(JSON.stringify(tree, null, 2));

输出结果为:

[
  {
    "id": 1,
    "name": "A",
    "parent_id": null,
    "children": [
      {
        "id": 2,
        "name": "B",
        "parent_id": 1,
        "children": [
          {
            "id": 3,
            "name": "C",
            "parent_id": 2,
            "children": [
              {
                "id": 6,
                "name": "F",
                "parent_id": 3
              }
            ]
          }
        ]
      },
      {
        "id": 4,
        "name": "D",
        "parent_id": 1,
        "children": [
          {
            "id": 5,
            "name": "E",
            "parent_id": 4
          }
        ]
      }
    ]
  }
]

ohoherror
19 声望1 粉丝