将一个数组转换为一棵树能够通过递归实现。假如咱们有一个蕴含父节点与子节点关系的数组,如下所示:
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 },];
当初咱们要将这个数组转换为一棵树,咱们须要做以下步骤:
- 遍历数组,找到根节点,即
parent_id
为null
的节点,将它们保留在一个新数组中。 - 对于每个根节点,递归地查找它的子节点。
- 对于每个子节点,将它退出其父节点的
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 } ] } ] }]