将一个数组转换为一棵树可以通过递归实现。假设我们有一个包含父节点与子节点关系的数组,如下所示:
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
}
]
}
]
}
]
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。