Vue将后端数据转成树形结构的方法示例代码

 更新时间:2025年06月14日 10:06:31   作者:ShareJasmine  
vue是一款流行的前端框架,其中很多操作都是基于数组进行的,这篇文章主要介绍了Vue将后端数据转成树形结构的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

1. 前言

需要将后端传来的数据转成嵌套的树形结构,后端数据形式如下:

[
  {
    "id": 48,
    "parentId": 47,
    "workspaceName": "工艺计划书合集",
    "workspaceCode": "A8-B1"
  },
  {
    "id": 47,
    "parentId": null,
    "workspaceName": "工艺计划书",
    "workspaceCode": "A8"
  },
  {
    "id": 26,
    "parentId": null,
    "workspaceName": "0501DKD工作指导书",
    "workspaceCode": "A2"
  },
  {
    "id": 29,
    "parentId": 26,
    "workspaceName": "月度计划工艺包装方案A",
    "workspaceCode": "A2-B1"
  },
  {
    "id": 35,
    "parentId": 26,
    "workspaceName": "月度计划工艺包装方案B",
    "workspaceCode": "A2-B2"
  }
]

2. 思路

首先,这里parentIdnull的是一级父节点,然后其他parentId有值的挂在对应id节点之后,最后整理的结果应该是这样一个效果:

[
  {
    "id": 47,
    "parentId": null,
    "workspaceName": "工艺计划书",
    "workspaceCode": "A8",
    "children": {
      "id": 48,
      "parentId": 47,
      "workspaceName": "工艺计划书合集",
      "workspaceCode": "A8-B1"
    }
  },
  {
    "id": 26,
    "parentId": null,
    "workspaceName": "0501DKD工作指导书",
    "workspaceCode": "A2",
    "children": [
      {
        "id": 29,
        "parentId": 26,
        "workspaceName": "月度计划工艺包装方案A",
        "workspaceCode": "A2-B1"
      },
      {
        "id": 35,
        "parentId": 26,
        "workspaceName": "月度计划工艺包装方案B",
        "workspaceCode": "A2-B2"
      }
    ]
  }
]

3. 代码

第一种是使用ES6的map语法:

function listToTree(data) {
  const map = new Map();
  const tree = [];

  // 第一步:遍历数据,将每一项存入 Map 中,并初始化 children = []
  data.forEach((p) => {
    p.children = [];
    // 将节点的 id 作为 key,整个节点对象作为 value 存入 Map
    map.set(p.id, p);
  });

  // 第二步:再遍历一次数据,根据 parentId 找到父节点,并将当前节点加入父节点的 children
  data.forEach((p) => {
    // 找到父节点,把当前节点挂载为其子节点
    // 注意由于 map 中的值为一个对象,属于引用数据类型,所以这里处理 map,就可以实现 tree 中出现相应的嵌套数据
    if (p.parentId !== null && map.has(p.parentId)) {
      map.get(p.parentId).children.push(p);
    } else {
      // 如果 parentId 为 null 或找不到父节点,则是顶级节点,加入 tree 根节点数组
      tree.push(p);
    }
  });

  return tree;
}

第二种是若依框架的兼容IE浏览器的写法:

/**
 * 构造树型结构数据
 * @param {*} data 数据源
 * @param {*} id id字段 默认 'id'
 * @param {*} parentId 父节点字段 默认 'parentId'
 * @param {*} children 孩子节点字段 默认 'children'
 */
export function handleTree(data, id, parentId, children) {
  let config = {
    id: id || 'id',
    parentId: parentId || 'parentId',
    childrenList: children || 'children',
  };

  var childrenListMap = {};
  var nodeIds = {};
  var tree = [];

  for (let d of data) {
    let parentId = d[config.parentId];
    if (childrenListMap[parentId] == null) {
      childrenListMap[parentId] = [];
    }
    nodeIds[d[config.id]] = d;
    childrenListMap[parentId].push(d);
  }

  for (let d of data) {
    let parentId = d[config.parentId];
    if (nodeIds[parentId] == null) {
      tree.push(d);
    }
  }

  for (let t of tree) {
    adaptToChildrenList(t);
  }

  function adaptToChildrenList(o) {
    if (childrenListMap[o[config.id]] !== null) {
      o[config.childrenList] = childrenListMap[o[config.id]];
    }
    if (o[config.childrenList]) {
      for (let c of o[config.childrenList]) {
        adaptToChildrenList(c);
      }
    }
  }
  return tree;
}

4. 完整演示Demo

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Document</title>
</head>

<body></body>

<script>
  const data = [
    {
      id: 48,
      parentId: 47,
      workspaceName: '工艺计划书合集',
      workspaceCode: 'A8-B1',
    },
    {
      id: 47,
      parentId: null,
      workspaceName: '工艺计划书',
      workspaceCode: 'A8',
    },
    {
      id: 26,
      parentId: null,
      workspaceName: '0501DKD工作指导书',
      workspaceCode: 'A2',
    },
    {
      id: 29,
      parentId: 26,
      workspaceName: '月度计划工艺包装方案A',
      workspaceCode: 'A2-B1',
    },
    {
      id: 35,
      parentId: 26,
      workspaceName: '月度计划工艺包装方案B',
      workspaceCode: 'A2-B2',
    },
  ];

  function listToTree(data) {
    const map = new Map();
    const tree = [];

    data.forEach((p) => {
      p.children = [];
      map.set(p.id, p);
    });

    data.forEach((p) => {
      if (p.parentId !== null && map.has(p.parentId)) {
        map.get(p.parentId).children.push(p);
      } else {
        tree.push(p);
      }
    });

    return tree;
  }

  const result = listToTree(data);

  console.log('result:', result);
</script>

</html>

总结

到此这篇关于Vue将后端数据转成树形结构的文章就介绍到这了,更多相关Vue后端数据转成树形结构内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue.js实现列表清单的操作方法

    Vue.js实现列表清单的操作方法

    Vue.js在设计上采用MVVM模式,当View视图层发生变化时,会自动更新到ViewModel.接下来通过本文给大家分享Vue.js实现列表清单的操作方法,需要的朋友参考下吧
    2017-11-11
  • vue3 + Ant Design 实现双表头表格的效果(横向表头+纵向表头)

    vue3 + Ant Design 实现双表头表格的效果(横向表头+纵向表头)

    这篇文章主要介绍了vue3 + Ant Design 实现双表头表格(横向表头+纵向表头),需要的朋友可以参考下
    2023-12-12
  • vue定义全局变量和全局方法的方法示例

    vue定义全局变量和全局方法的方法示例

    这篇文章主要介绍了vue定义全局变量和全局方法的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • vue3中form对象无法赋值的问题解决

    vue3中form对象无法赋值的问题解决

    这篇文章给大家介绍了vue3中form对象无法赋值的问题解决,有时候对象的值死活赋不上值,这时候可以看下赋值的对象变量名是否和页面组件中的ref相同,文中给出了代码示例供大家参考,需要的朋友可以参考下
    2024-01-01
  • vue项目优化之通过keep-alive数据缓存的方法

    vue项目优化之通过keep-alive数据缓存的方法

    本篇文章主要介绍了vue项目优化之通过keep-alive数据缓存的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • vue2.0 获取从http接口中获取数据,组件开发,路由配置方式

    vue2.0 获取从http接口中获取数据,组件开发,路由配置方式

    今天小编就为大家分享一篇vue2.0 获取从http接口中获取数据,组件开发,路由配置方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • vue配置vue.config.js超详细教程

    vue配置vue.config.js超详细教程

    Vue的配置项'vue.config.js'是用来配置Vue项目的构建配置的,它是一个可选的配置文件,放置在项目的根目录下,这篇文章主要给大家介绍了关于vue配置vue.config.js的相关资料,需要的朋友可以参考下
    2024-01-01
  • mpvue跳转页面及注意事项

    mpvue跳转页面及注意事项

    这篇文章主要介绍了mpvue跳转页面及注意事项的相关资料,需要的朋友可以参考下
    2018-08-08
  • Vue js with语句原理及用法解析

    Vue js with语句原理及用法解析

    这篇文章主要介绍了Vue js with语句原理及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Vue3使用pinia进行数据添加、修改和删除的操作代码

    Vue3使用pinia进行数据添加、修改和删除的操作代码

    Pinia 是 Vue 3 的官方状态管理库,旨在提供一种简单、灵活且类型安全的状态管理解决方案,Pinia 的设计理念与 Vuex 类似,但更加轻量且易于使用,文旨在全面解析 Vue 3 中如何使用 Pinia 进行数据的添加、修改和删除,需要的朋友可以参考下
    2025-03-03

最新评论