word目录编号转树状结构

“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'}];
复制代码

页面展示

二、思路分析:

  1. 先要确定根节点
  1. 第一次循环,拿到txtId,根据txtId,用string中的spit方法切割成数组
  1. 循环,判断是否存在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;

image.png

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享