后端返回JSON数组转Tree树形格式,展示到element-ui的tree树形组件

  • Post author:
  • Post category:其他


将js数组转换成tree树形组件要的数据格式,有时候后端返回的是数组没有处理成树状结构,这个时候就需要前端自行转换,这里采用递归方式转换

要展示的效果

展示效果

上代码

<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>数组对象转Tree结构</title>
  </head>
  <body>
    <div id="app">
      <el-tree :data="data" :props="defaultProps" ></el-tree>
    </div>
    <script src="https://unpkg.com/vue/dist/vue.js"></script>
    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css" />
    <script src="https://unpkg.com/element-ui/lib/index.js"></script>
    <script>
      // 封装函数
      // 找出对应id的子节点
      function arrToTree(arr, id) {
        let children = [] // 用于存放子节点
        arr.forEach(v => {
          // 找出对应的id的节点
          if (v.pid === id) {
            // 保存到对象
            let obj = { label: v.job }
            // 继续递归遍历找出子节点
            let node = arrToTree(arr, v.id)
            // 判断是否有子节点
            if(node.length) obj.children = node
            // 将子节点添加到数组
            children.push(obj)
          }
        })
        // 返回找到的结果
        return children
      }
		// vue实例对象
      new Vue({
        el: "#app",
        data: function () {
          return {
            arr: [
              { id: "01", name: "大老板", pid: "", job: "总办" },
              { id: "02", name: "老吴", pid: "01", job: "产品部" },
              { id: "03", name: "小美", pid: "01", job: "人事部" },
              { id: "04", name: "小马", pid: "01", job: "开发部" },
              { id: "05", name: "小王", pid: "01", job: "测试部" },
              { id: "06", name: "小李", pid: "01", job: "运维部" },
              { id: "07", name: "丽丽", pid: "02", job: "产品1" },
              { id: "08", name: "大爷", pid: "02", job: "产品2" },
              { id: "09", name: "老高", pid: "03", job: "UI设计师" },
              { id: "10", name: "刘丽", pid: "04", job: "前端工程师" },
              { id: "11", name: "张华", pid: "04", job: "后端工程师" },
              { id: "12", name: "李丹", pid: "04", job: "后端工程师" },
              { id: "13", name: "老赵", pid: "05", job: "测试工程师" },
              { id: "14", name: "强哥", pid: "05", job: "测试工程师" },
              { id: "15", name: "老大爷", pid: "06", job: "运维工程师" }
            ],
            data: [],
            defaultProps: {
              children: "children",
              label: "label"
            }
          }
        },
        created() {
          let tree = []
          // 找出所有根节点
          this.arr.forEach((v, i) => {
            if (!v.pid) {
              tree.push({ label: v.job, children: arrToTree(this.arr, v.id) })
            }
          })
          this.data = tree // 将转换结果显示到页面
          console.log(JSON.parse(JSON.stringify( tree )));
        }
      })
    </script>
  </body>
</html>


简洁写法

<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Tree组件</title>
    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css" />
  </head>
  <body>
    <div id="app">
      <el-tree :data="data" :props="defaultProps"></el-tree>
    </div>
    <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14"></script>
    <script src="https://unpkg.com/element-ui/lib/index.js"></script>
    <script>
      const app = new Vue({
        el: "#app",
        data: {
          arr: [
            { id: "01", name: "张大大", pid: "", job: "项目经理" },
            { id: "02", name: "小亮", pid: "01", job: "产品leader" },
            { id: "03", name: "小美", pid: "01", job: "UIleader" },
            { id: "04", name: "老马", pid: "01", job: "技术leader" },
            { id: "05", name: "老王", pid: "01", job: "测试leader" },
            { id: "06", name: "老李", pid: "01", job: "运维leader" },
            { id: "07", name: "小丽", pid: "02", job: "产品经理" },
            { id: "08", name: "大光", pid: "02", job: "产品经理" },
            { id: "09", name: "小高", pid: "03", job: "UI设计师" },
            { id: "10", name: "小刘", pid: "04", job: "前端工程师" },
            { id: "11", name: "小华", pid: "04", job: "后端工程师" },
            { id: "12", name: "小李", pid: "04", job: "后端工程师" },
            { id: "13", name: "小赵", pid: "05", job: "测试工程师" },
            { id: "14", name: "小强", pid: "05", job: "测试工程师" },
            { id: "15", name: "小涛", pid: "06", job: "运维工程师" }
          ],
          data: [],
          defaultProps: {
            children: "children",
            label: "label"
          }
        },
        async created() {
          // 先将一级节点找出,在调用方法寻找子级
          this.data = this.arr.reduce((p, v) => {
            return v.pid === "" ? p.concat([this.createTreeObj(v.name, this.getChildren(this.arr, v.id))]) : p
          }, [])
          console.log(this.data);
        },
        methods: {
          // 通过id寻找子级方法,返回结果数组
          getChildren(arr, id) {
            return arr.reduce((p, v) => {
              return v.pid === id ? p.concat([this.createTreeObj(v.name, this.getChildren(arr, v.id))]) : p
            }, [])
          },
          // 生成对象,根据defaultProps对象中的属性值来生成指定的对象
          createTreeObj(label, children){
            const obj = {}
            obj[this.defaultProps.label] = label
            if(children.length > 0) obj[this.defaultProps.children] = children // 有数据的就添加到对象
            return obj
          }
        }
      })
    </script>
  </body>
</html>



版权声明:本文为weixin_46028831原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。