“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”
一、题目描述:
项目中有次需要根据后台返回的数据展示成树状结构,因为是做的文本提取,后台只能返回当前目录的编号,所以需要个根据目录编号确定相应的层级,进而转换成树状结构
数据结构如下:
const listData = [{ txtId: '1', label: '一级1'},
{ txtId: '1.1', label: '一级1.1'},
{ txtId: '1.1.1', label: '一级1.1.1'},
{ txtId: '1.1.2', label: '一级1.1.2'},
{ txtId: '1.1.3', label: '一级1.1.3'},
{ txtId: '1.2.1', label: '一级1.2.1'},
{ txtId: '1.2.2', label: '一级1.2.2'},
{ txtId: '1.2.3', label: '一级1.2.3'},
{ txtId: '1.3', label: '一级1.3'},
{ txtId: '1.4', label: '一级1.4'},
{ txtId: '1.4.1', label: '一级1.4.1'}];
复制代码
页面展示
二、思路分析:
- 先要确定根节点
- 第一次循环,拿到txtId,根据txtId,用string中的spit方法切割成数组
- 循环,判断是否存在result,不存在,则创建children,存在,则添加到children中
三、AC 代码:
// 判断id是否存在于list中
function pos(list, id) {
let _pos = -1;
list.map((d, i) => {
if (d.id === id) {
_pos = i;
}
});
return _pos;
}
function listStrToTree(data) {
const result = [];
data.map((d) => {
const child = d.txtId.split('.');
let temp = result;
child.map((d2) => {
const _pos = pos(temp, d2);
if( _pos !== -1 ){
temp = temp[_pos]['children'];
} else {
temp.push({
id: d2,
txtId: d.txtId,
label: d.label,
children: []
});
temp = temp[temp.length - 1]['children'];
}
});
});
return result;
}
复制代码
四、总结:
id是为了确认是否存在于当前txtId切割后的数组中,在整个树状数据中,仍然需要一个唯一的id,所以可以将txtId作为key绑定唯一的id;
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END