JavaScript如何将数据处理成树形结构

 更新时间:2023年06月07日 10:16:21   作者:司宁  
这篇文章主要介绍了JavaScript如何将数据处理成树形结构问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

JavaScript将数据处理成树形结构

第一个方法是使用递归

可以处理多层嵌套。

(react的value值和key值不一样是会报错的,而且key值要唯一,如果这组数据需要带有搜索功能的话是要设置treeNodeFilterProp来指定根据哪个字段来搜索的)。

如果传进来的数据保证是有字段的可以省略判断的步骤,递归这个方法也可以结合第二个方法让代码看起来更简洁。

function toTree(data) {
    for (let i = 0; i < data.length; i++) {
      data[i].value = data[i].id || '';
      data[i].title = data[i].name || '';
      data[i].key = data[i].id || '';
      data[i].children = data[i].list || [];
      if (data[i].children && data[i].children.length > 0) {
        toTree(data[i].children);
      }
    }
    return data;
}

第二个方法是直接遍历

只能处理一层嵌套,但是要比递归简单,由于react可以只设置value和key其中一个,在这个方法中就不特别增加key了。

function toTree(data) {
    return data.map((item) => {
      return {
        title: item.name,
        value: item.id,
        children: item.list.map((item1) => {
          return {
            title: item1.name,
            value: item1.id,
          };
        }),
      };
    });
}

根据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;
        }
      }
    }
  },

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

相关文章

  • JS 截取字符串substr 和 substring方法的区别

    JS 截取字符串substr 和 substring方法的区别

    JS 截取字符串substr 和 substring方法的区别,需要的朋友可以参考下,根据需要自行选择。
    2009-10-10
  • BootStrap表单宽度设置方法

    BootStrap表单宽度设置方法

    这篇文章主要介绍了BootStrap表单宽度设置方法,仅仅是小编日常遇到问题记录,写的不好还请见谅,需要的朋友可以参考下
    2017-03-03
  • 解析Javascript小括号“()”的多义性

    解析Javascript小括号“()”的多义性

    这篇文章主要介绍了Javascript小括号“()”的多义性。需要的朋友可以过来参考下,希望对大家有所帮助
    2013-12-12
  • 小程序测试后台服务的方法(ngrok)

    小程序测试后台服务的方法(ngrok)

    这篇文章主要介绍了小程序测试后台服务的方法(ngrok),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • 在线编辑器的实现原理(兼容IE和FireFox)

    在线编辑器的实现原理(兼容IE和FireFox)

    在线编辑器的实现原理(兼容IE和FireFox)...
    2007-03-03
  • js对象数组按属性快速排序

    js对象数组按属性快速排序

    前一篇《关于selector性能比赛》中提到,目测觉得在$("div,p,a")这样有逗号时,sizzle耗时异常(600多个元素,花了200ms),说是它可能没有优化ie下的排序。
    2011-01-01
  • JS访问SWF的函数用法实例

    JS访问SWF的函数用法实例

    这篇文章主要介绍了JS访问SWF的函数用法,实例分析了javascript访问swf文件的方法及易错点的处理技巧,需要的朋友可以参考下
    2015-07-07
  • 最常用的12种设计模式小结

    最常用的12种设计模式小结

    最常用的12种设计模式小结,学习js的朋友可以参考下。
    2011-08-08
  • 简单使用webpack打包文件的实现

    简单使用webpack打包文件的实现

    这篇文章主要介绍了简单使用webpack打包文件的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • js闭包的6种应用场景总结

    js闭包的6种应用场景总结

    如果一个函数访问了此函数的父级及父级以上的作用域变量,那么这个函数就是一个闭包,本文将给大家分享js闭包的6种应用场景,文中有详细的代码示例,需要的朋友可以参考下
    2023-09-09

最新评论