uni-app 使用查询树形数据gettree时 查询出来的数据不是树形结构

发布于 1周前 作者 eggper 来自 Uni-App

uni-app 使用查询树形数据gettree时 查询出来的数据不是树形结构

操作步骤:

查询使用 getTree: true时,查询出来的数据不是树形结构。

预期结果:

"data": [{
"_id": "66f4dde0816a3ffb2d6403ca",
"name": "内科",
"code": "100",
"parent_code": "",
"intro": "内科方面的综合科室",
"order": 1
"children": [{
"_id": "66f4ddfb466d41e2fab72492",
"name": "呼吸内科",
"code": "101",
"parent_code": "100",
"intro": "呼吸内科方面的综合科室",
"order": 1
}]
}]

实际结果:

{
"affectedDocs": 2,
"data": [
{
"_id": "66f4dde0816a3ffb2d6403ca",
"name": "内科",
"code": "100",
"parent_code": "",
"intro": "内科方面的综合科室",
"order": 1
},
{
"_id": "66f4ddfb466d41e2fab72492",
"name": "呼吸内科",
"code": "101",
"parent_code": "100",
"intro": "呼吸内科方面的综合科室",
"order": 1
}
]
}

## bug描述:
使用查询树形数据gettree时,查询出来的数据不是树形结构。科室表的schema定义反复看了没问题,云对象查询方法也没问题

![Image 1](https://www.itying.com/uniimg.php?url=https://img-cdn-tc.dcloud.net.cn/uploads/questions/20240926/34546cb5b26a9280545c64f9b17ce670.png)
![Image 2](https://www.itying.com/uniimg.php?url=https://img-cdn-tc.dcloud.net.cn/uploads/questions/20240926/efbca87055b088237c90c381cb5cbe72.jpg)
![Image 3](https://www.itying.com/uniimg.php?url=https://img-cdn-tc.dcloud.net.cn/uploads/questions/20240926/745a3dd5f7280646d6f30618c900b05a.jpg)

1 回复

在使用uni-app处理树形数据时,如果你通过gettree方法查询出来的数据不是树形结构,通常意味着你需要在前端进行数据转换。下面是一个简单的示例,展示如何将扁平结构的数据转换为树形结构。

假设你有一个扁平的数组结构,每个节点都有一个唯一的id和一个表示其父节点的parentId。以下代码将展示如何将这些数据转换为树形结构。

// 示例数据
const flatData = [
    { id: 1, parentId: null, name: 'Root 1' },
    { id: 2, parentId: 1, name: 'Child 1-1' },
    { id: 3, parentId: 1, name: 'Child 1-2' },
    { id: 4, parentId: 2, name: 'Grandchild 1-1-1' },
    { id: 5, parentId: null, name: 'Root 2' },
    { id: 6, parentId: 5, name: 'Child 2-1' }
];

// 转换函数
function buildTree(data, parentId = null) {
    return data
        .filter(item => item.parentId === parentId)
        .map(item => ({
            ...item,
            children: buildTree(data, item.id)
        }));
}

// 使用转换函数
const treeData = buildTree(flatData);

// 输出树形结构
console.log(JSON.stringify(treeData, null, 2));

在上面的代码中:

  1. flatData 是你的原始扁平数据结构。
  2. buildTree 函数递归地将数据转换为树形结构。它接受两个参数:data 是全部数据,parentId 是当前节点的父节点ID(默认为null,表示根节点)。
  3. buildTree函数内部,首先使用filter方法筛选出所有父节点ID等于当前parentId的项,然后对每个项使用map方法创建一个新对象,该对象包含当前项及其子节点(通过递归调用buildTree获得)。
  4. 最后,调用buildTree函数并传入原始数据,得到转换后的树形结构treeData

这种方法适用于大多数需要将扁平数据转换为树形结构的场景。如果你的gettree方法返回的数据格式略有不同,你可能需要调整buildTree函数中的筛选和映射逻辑。不过,核心思想是利用递归构建树形结构,这是处理此类问题的通用方法。

回到顶部