expres+mysql+js sys_menu 表有parent_id和childLevel_id 怎么把表里请求的数据扁平化转成树形结构
时间: 2024-09-24 08:16:05 浏览: 62
在Express、MySQL和JavaScript的项目中,将`sys_menu`表中的数据转换成树形结构通常需要分步操作:
1. **查询数据库**:
使用Node.js的mysql库连接到MySQL服务器,编写SQL查询来获取`sys_menu`表的数据,包括`parent_id`和`childLevel_id`字段,可能还需要额外的条件如ID或其他标识。
```javascript
const mysql = require('mysql');
// 创建数据库连接
const connection = mysql.createConnection({
host: 'localhost',
user: 'your_user',
password: 'your_password',
database: 'your_database'
});
connection.connect();
let sql = `SELECT * FROM sys_menu WHERE parent_id IS NULL`; // 查询根节点
connection.query(sql, (err, results) => {
if (err) throw err;
// 根据查询结果初始化树形结构
const menuTree = buildMenuTree(results);
});
```
2. **构建树形数据结构**:
写一个递归函数`buildMenuTree`,通过遍历查询结果,根据`parent_id`关联每个菜单项与其父级,并将其添加到相应父节点的子节点数组中。
```javascript
function buildMenuTree(data) {
let treeData = [];
data.forEach((menu) => {
let newNode = { id: menu.id, text: menu.title, children: [] };
// 如果找到匹配的父ID,则将其添加为子节点
data.find((parent) => parent.id === menu.parent_id).children.push(newNode);
// 如果是根节点,直接添加到树数据
if (!menu.parent_id) {
treeData.push(newNode);
}
});
// 遍历所有父节点,如果它们有子节点,再递归处理子节点
treeData.forEach(menu => {
if (menu.children.length > 0) {
treeData = treeData.concat(buildMenuTree(menu.children));
}
});
return treeData;
}
```
3. **返回树形结构**:
完成递归后,你可以返回整个`treeData`数组作为扁平化的树形结构。
```javascript
connection.end();
return treeData;
```
阅读全文