根据id 将平级数据转换成树形结构数据

从数据库查询的每一条数据都包含id 和pid 字段,将获得的数据转换成树形结构

id 与 pid 的关系 ===> pid 等于0 的是最外层数据, pid 等于最外层 数据的id,将这条数据放在第二层,

不确定有多少层,理论上可以有无数层,循环数据变成树形结构:

 

// 数据循环
    levelLoop(arr) {
      const returnArr = []; // 返回的数组
      let levelArr = []; // 当前层级的数组
      let lastLevelArr = []; // 上一层数组
      let idLevleArr = []; // 当前层级id的数组
      let lastIdLevleArr = []; // 上一层级id的数组
      let indexLevelArr = []; // 当前层级索引的数组
      return curLoop(arr);
      function curLoop(curArr) {
        curArr.forEach((curItem, curIndex) => {
          if (curItem.pid === 0) {
            // 最外层
            returnArr.push(curItem);
            levelArr.push(curItem);
            idLevleArr.push(curItem.id);
            indexLevelArr.unshift(curIndex); // 添加到最前面,遍历删除元素时从后面开始删除,不会影响index的位置
          } else {
            const lastIndex = lastIdLevleArr.indexOf(curItem.pid);
            if (lastIndex > -1) {
              // 属于上一层级的子级
              // 如果上一层级没有child则添加该属性,此时添加是保证有子元素指向上一层级才添加child
              if (!lastLevelArr[lastIndex].children) {
                lastLevelArr[lastIndex].children = [];
              }
              levelArr.push(curItem);
              lastLevelArr[lastIndex].children.push(curItem);
              idLevleArr.push(curItem.id);
              indexLevelArr.unshift(curIndex);
            }
          }
        });
        lastLevelArr = levelArr;
        levelArr = [];
        lastIdLevleArr = idLevleArr;
        idLevleArr = [];
        indexLevelArr.forEach(index => {
          curArr.splice(index, 1); // 删除当前层级的元素,使总数量不断减少
        });
        indexLevelArr = [];
        if (curArr.length) {
          return curLoop(curArr);
        } else {
          return returnArr;
        }
      }
    }
  },

 

### Vue 实现数组转树形结构Vue 项目中,可以创建一个方法来将扁平化的数组转换树形结构数据。此过程涉及遍历原始数组并构建父子关系。 对于给定的节点列表,假设每个对象都有 `id` 和 `parentId` 属性用于表示唯一标识符及其父级关联[^1]: ```javascript function arrayToTree(data, rootId = null) { const treeData = []; // 创建映射表提高查找效率 const idMap = new Map(); data.forEach(item => { item.children = []; idMap.set(item.id, item); }); data.forEach(item => { if (item.parentId === rootId || !rootId && !item.parentId) { treeData.push(item); } else { let parentItem = idMap.get(item.parentId); if (parentItem) { parentItem.children.push(item); } } }); return treeData; } ``` 为了使该函数适用于 Vue 组件内部,在 methods 或 computed 中定义上述逻辑,并确保传入的数据已经过适当处理以便于展示[^2]。 当需要渲染这些嵌套结构时,可以通过递归组件的方式轻松完视图层面上的表现。下面是一个简单的例子说明如何利用这个工具函数以及相应的模板代码片段[^3]: ```vue <template> <ul> <li v-for="node in nodes" :key="node.id"> {{ node.name }} <tree-view v-if="node.children.length" :nodes="node.children"></tree-view> </li> </ul> </template> <script> export default { name: 'TreeView', props: ['nodes'], }; </script> ``` 通过这种方式可以在前端高效地呈现具有层次感的信息架构,同时也保持了良好的可维护性和扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值