写一个把扁平数组转成树结构的函数(可认为只存在一个根节点)
时间: 2024-09-14 10:04:11 浏览: 69
【list转树结构】相关附件
将扁平数组转换成树结构的函数通常需要一个额外的参数,比如每个节点的id和其父节点的id。下面是一个简单的示例,这个函数将根据扁平数组中的数据,递归地构建出树形结构:
```javascript
// 定义树节点构造函数
function TreeNode(id, children = []) {
this.id = id;
this.children = children;
}
// 将扁平数组转成树结构的函数
function buildTree(flatArray, idKey, parentIdKey, rootId) {
// 将数组转换为以 id 为键的对象,方便查找
const map = {};
for (const item of flatArray) {
map[item[idKey]] = new TreeNode(item[idKey]);
}
// 构建树
for (const item of flatArray) {
const node = map[item[idKey]];
// 如果存在父节点,就将其子节点添加到父节点的 children 数组中
if (item[parentIdKey] != null) {
if (!map[item[parentIdKey]]) {
map[item[parentIdKey]] = new TreeNode(item[parentIdKey]);
}
map[item[parentIdKey]].children.push(node);
}
}
// 返回根节点的子节点
return map[rootId].children;
}
// 示例数组
const flatArray = [
{ id: 1, parentId: null },
{ id: 2, parentId: 1 },
{ id: 3, parentId: 1 },
{ id: 4, parentId: 2 },
{ id: 5, parentId: 3 },
];
// 调用函数,idKey 和 parentIdKey 分别是'key'和'parentKey'
const tree = buildTree(flatArray, 'id', 'parentId', 1);
// 打印树结构
console.log(tree);
```
这段代码中,`buildTree`函数接受四个参数:扁平数组`flatArray`,节点id的键`idKey`,节点父id的键`parentIdKey`和根节点的id`rootId`。函数内部首先将扁平数组中的每个元素映射为一个树节点对象,并将其存储在一个以id为键的对象中以便快速访问。然后,通过遍历数组构建树形结构,最终返回根节点的子节点。
阅读全文