前端学习案例-js实现树形结构化
我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号关注小歌谣 日常分享前后端知识
前言
今天来讲一下平常我们做权限系统中的树形结构知识
就是如何把对应关系的结构数据转换为可以一个树形结构
const data = [
{
id: 2,
pid: 0,
path: '/course',
name: 'Course',
title: '课程管理'
},
{
id: 3,
name: 'CourseOperate',
path: 'operate',
link: '/course/operate',
pid: 2,
title: '课程操作'
},
{
id: 4,
name: 'CourseInfoData',
path: 'info_data',
link: '/course/operate/info_data',
pid: 3,
title: '课程数据'
},
{
id: 5,
name: 'CourseAdd',
path: 'add',
link: '/course/add',
pid: 2,
title: '增加课程'
},
{
id: 6,
pid: 0,
path: '/student',
name: 'Student',
title: '学生管理',
},
{
id: 7,
name: 'StudentOperate',
path: 'operate',
link: '/student/operate',
pid: 6,
title: '学生操作'
},
{
id: 8,
name: 'StudentAdd',
path: 'add',
link: '/student/add',
pid: 6,
title: '增加学生'
},
{
id: 9,
name: '123123',
path: '234234',
link: '/student/add',
pid: 8,
title: '增加学生'
},
{
id: 10,
name: '234234',
path: '345345',
link: '/student/add',
pid: 9,
title: '增加学生'
},
{
id: 11,
name: '345345',
path: '456456',
link: '/student/add',
pid: 10,
title: '增加学生'
}
];
数据大概是以上这样的
要给他转换为树形结构
可以开始直接操作了
基本数据
// 树形结构数据结构化
/**
* [
* {
id: 2,
pid: 0,
path: '/course',
name: 'Course',
title: '课程管理',
children: [
{
id: 3,
name: 'CourseOperate',
path: 'operate',
link: '/course/operate',
pid: 2,
title: '课程操作',
children: [
{
id: 4,
name: 'CourseInfoData',
path: 'info_data',
link: '/course/operate/info_data',
pid: 3,
title: '课程数据'
}
]
},
{
id: 5,
name: 'CourseAdd',
path: 'add',
link: '/course/add',
pid: 2,
title: '增加课程'
}
]
},
* {
id: 6,
pid: 0,
path: '/student',
name: 'Student',
title: '学生管理',
children: [
{
id: 7,
name: 'StudentOperate',
path: 'operate',
link: '/student/operate',
pid: 6,
title: '学生操作'
},
{
id: 8,
name: 'StudentAdd',
path: 'add',
link: '/student/add',
pid: 6,
title: '增加学生'
}
]
}
* ]
结构这样
两种方式处理数据
直接上代码 可以自己调试
const treeData = formatDataTree(data);
console.log(treeData);
// function formatDataTree (data) {
// let parents = data.filter(p => p.pid === 0),
// children = data.filter(c => c.pid !== 0);
// dataToTree(parents, children);
// return parents;
// // parents childrens array []
// function dataToTree (parents, children) {
// parents.map(p => {
// children.map((c, i) => {
// if (c.pid === p.id) {
// let _children = JSON.parse(JSON.stringify(children));
// _children.splice(i, 1);
// dataToTree([c], _children);
// if (p.children) {
// p.children.push(c);
// } else {
// p.children = [c];
// }
// }
// });
// })
// }
// }
function formatDataTree (data) {
let _data = JSON.parse(JSON.stringify(data));
return _data.filter(p => {
const _arr = _data.filter(c => c.pid === p.id);
_arr.length && (p.children = _arr);
return p.pid === 0;
});
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了