详解JavaScript中扁平与树形数据的转换

我来为你详细讲解“详解JavaScript中扁平与树形数据的转换”的完整攻略。

前言

在前端开发中,我们经常需要把扁平数据转换为树形结构数据,或者将树形结构数据转换为扁平数据,这种数据格式转换操作在开发中很常见。本篇文章将对JavaScript中扁平数据和树形结构数据的转换进行详细介绍。

扁平数据与树形结构数据

扁平数据

扁平数据是指没有嵌套结构,所有数据都在同一层级下的数据结构。例如:

const flatData = [
  {id: 1, name: 'A', parentId: null},
  {id: 2, name: 'B', parentId: null},
  {id: 3, name: 'C', parentId: 1},
  {id: 4, name: 'D', parentId: 1},
  {id: 5, name: 'E', parentId: 2},
  {id: 6, name: 'F', parentId: 4},
  {id: 7, name: 'G', parentId: 5},
];

上面的扁平数据中,id表示节点编号,name表示节点名称,parentId表示父节点编号。

树形结构数据

树形结构数据是指具有嵌套关系的数据结构,例如:

const treeData = [
  {
    id: 1,
    name: 'A',
    children: [
      {
        id: 3,
        name: 'C',
      },
      {
        id: 4,
        name: 'D',
        children: [
          {
            id: 6,
            name: 'F',
          }
        ]
      }
    ]
  },
  {
    id: 2,
    name: 'B',
    children: [
      {
        id: 5,
        name: 'E',
        children: [
          {
            id: 7,
            name: 'G',
          }
        ]
      }
    ]
  }
];

上述树形数据中,每个节点都有一个唯一的编号id和名称name,还有子节点children。

扁平数据转树形结构数据

在具体实现扁平数据转树形结构数据的过程中,我们可以通过遍历扁平数据,将每个节点依次添加到相应的父节点的children数组中。

下面是一个示例代码,具体的注释可以帮助理清转换的流程:

function flatToTree(flatData) {
  // 通过map构造一个节点编号到节点对象的映射
  const nodeMap = flatData.reduce((map, node) => {
    map[node.id] = node;
    return map;
  }, {});

  // 通过遍历构造树形结构
  const treeData = [];
  for (const node of flatData) {
    const parent = nodeMap[node.parentId];
    if (parent) {
      // 如果有父节点,就将自己加入父节点的children数组中
      (parent.children || (parent.children = [])).push(node);
    } else {
      // 如果没有父节点,就认为自己是根节点
      treeData.push(node);
    }
  }
  return treeData;
}

上面的代码首先是通过map构造一个节点编号到节点对象的映射,这样方便我们在后续的遍历操作中快速找到父节点对象。接着,遍历整个扁平数据,通过nodeMap找到每个节点的父节点,然后将自己加入父节点的children数组中,最后返回整个树形结构数据。

下面我们执行一下上面代码的示例:

const flatData = [
  {id: 1, name: 'A', parentId: null},
  {id: 2, name: 'B', parentId: null},
  {id: 3, name: 'C', parentId: 1},
  {id: 4, name: 'D', parentId: 1},
  {id: 5, name: 'E', parentId: 2},
  {id: 6, name: 'F', parentId: 4},
  {id: 7, name: 'G', parentId: 5},
];

const treeData = flatToTree(flatData);
console.log(treeData);

输出结果:

[
  {
    "id": 1,
    "name": "A",
    "children": [
      {
        "id": 3,
        "name": "C"
      },
      {
        "id": 4,
        "name": "D",
        "children": [
          {
            "id": 6,
            "name": "F"
          }
        ]
      }
    ]
  },
  {
    "id": 2,
    "name": "B",
    "children": [
      {
        "id": 5,
        "name": "E",
        "children": [
          {
            "id": 7,
            "name": "G"
          }
        ]
      }
    ]
  }
]

树形结构数据转扁平数据

接下来让我们来介绍树形结构数据转扁平数据。

在具体实现树形结构数据转扁平数据的过程中,我们可以通过递归遍历整个树形结构,将每个节点依次添加到扁平数据中。

下面是一个示例代码,具体的注释可以帮助理清转换的流程:

function treeToFlat(treeData) {
  const flatData = [];

  function traverse(node, parentId) {
    // 构造节点对象
    const flatNode = {
      id: node.id,
      name: node.name,
      parentId
    };
    flatData.push(flatNode);

    // 遍历子节点
    if (node.children) {
      for (const child of node.children) {
        traverse(child, node.id);
      }
    }
  }

  // 从根节点开始遍历
  for (const node of treeData) {
    traverse(node, null);
  }

  return flatData;
}

上面的代码首先是通过traverse函数递归遍历整个树形结构,将每个节点构造成扁平数据格式,然后添加到flatData数组中。关键在于递归调用traverse函数时要传入父节点的id作为parentId,这样可以准确地还原出节点的父子关系。

下面我们执行一下上面代码的示例:

const treeData = [
  {
    id: 1,
    name: 'A',
    children: [
      {
        id: 3,
        name: 'C',
      },
      {
        id: 4,
        name: 'D',
        children: [
          {
            id: 6,
            name: 'F',
          }
        ]
      }
    ]
  },
  {
    id: 2,
    name: 'B',
    children: [
      {
        id: 5,
        name: 'E',
        children: [
          {
            id: 7,
            name: 'G',
          }
        ]
      }
    ]
  }
];

const flatData = treeToFlat(treeData);
console.log(flatData);

输出结果:

[
  {
    "id": 1,
    "name": "A",
    "parentId": null
  },
  {
    "id": 3,
    "name": "C",
    "parentId": 1
  },
  {
    "id": 4,
    "name": "D",
    "parentId": 1
  },
  {
    "id": 6,
    "name": "F",
    "parentId": 4
  },
  {
    "id": 2,
    "name": "B",
    "parentId": null
  },
  {
    "id": 5,
    "name": "E",
    "parentId": 2
  },
  {
    "id": 7,
    "name": "G",
    "parentId": 5
  }
]

总结

以上就是将扁平数据转换为树形数据和将树形数据转换为扁平数据的JavaScript实现方法。在实际项目中,我们需要依据具体业务场景,选用合适的方法来处理数据,本文的方法旨在提供一种思路,读者可以根据自己的需要灵活应用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解JavaScript中扁平与树形数据的转换 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • 使用node.js 获取客户端信息代码分享

    下面是使用node.js获取客户端信息的攻略。 获取客户端信息 什么是客户端信息? 在网络通信中,客户端是指使用网络服务的用户终端(如电脑、手机、平板等),客户端信息是指提供如客户端类型、操作系统、浏览器等与客户端相关的信息。 如何获取客户端信息? 在Node.js中,可以通过request对象来获取HTTP请求的相关信息,其中包括客户端信息。request…

    node js 2023年6月8日
    00
  • Nodejs异步流程框架async的方法

    Node.js异步流程框架async提供了一套强大的方法,可以帮助我们更好地处理异步操作。下面是async方法的详细攻略: async方法的概览 async方法是一个流程控制工具,它提供了一组有用的API,可以让我们更方便地处理异步操作。async方法可以分为以下六个类别: 控制流程:提供了一些方法,可以控制异步操作的流程,比如串行执行、并行执行等。 集合操…

    node js 2023年6月8日
    00
  • 详解用Node.js实现Restful风格webservice

    详解用Node.js实现Restful风格webservice 在本文中,我们将详细讲解如何使用Node.js实现Restful风格的webservice。Node.js是一个基于Chrome的JavaScript运行环境,可以使用JavaScript开发服务器端应用程序。Restful风格的webservice是一种基于HTTP通信协议,使用Web标准来提…

    node js 2023年6月8日
    00
  • 基于nodejs的微信JS-SDK简单应用实现

    作为网站的作者,我很高兴为大家介绍“基于nodejs的微信JS-SDK简单应用实现”的完整攻略。 具体步骤 1. 注册开发者账号 首先需要在微信公众平台上注册成为开发者,得到相应的AppID和AppSecret。具体步骤如下: 打开微信公众平台官网 点击右上角“注册”,按照提示进行填写 注册完成后登录,进入管理后台 在左侧导航栏中找到“开发->基本配置…

    node js 2023年6月8日
    00
  • Node.js之删除文件夹(含递归删除)代码实例

    Node.js之删除文件夹(含递归删除)代码实例 前言 在Node.js中,删除文件夹的操作并不难,但是删除带有子文件夹和子文件的文件夹,就需要使用递归方式删除。本文将会提供两个示例说明在Node.js中如何实现带有子文件夹和子文件的文件夹的删除。 操作步骤 步骤一:安装依赖 在Node.js中,使用fs(file system)模块进行文件和文件夹的操作。…

    node js 2023年6月8日
    00
  • node.js中实现同步操作的3种实现方法

    当我们使用Node.js时,我们通常会遇到异步编程的问题。但是,在某些情况下,我们需要执行同步操作,以便我们的代码在完成同步操作后才继续执行。以下是在Node.js中实现同步操作的3种方法: 1. 使用Sync模块 Sync模块是Node.js中实现同步操作的一种方法。可以在执行同步操作时使用此方法。例如: var fs = require("fs…

    node js 2023年6月8日
    00
  • 利用Node转换Excel成JSON的详细步骤

    利用Node.js转换Excel文件为JSON格式的过程大致可分为以下几步: 安装依赖库:首先我们需要安装一些必要的Node.js依赖库,比如xlsx和fs,这些库可以通过NPM(Node Package Manager)进行安装 npm install –save xlsx fs 读取Excel文件:使用xlsx库可以读取Excel文件并将其转换为JSO…

    node js 2023年6月8日
    00
  • node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用

    下面是详细讲解“node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用”的完整攻略。 简介 在 Node.js 开发中,我们经常需要修改代码并重新启动应用来查看效果,这个过程比较繁琐,而 Node Supervisor 出现就是为了简化这个过程,它可以监控文件修改并自动重启应用,让我们专注于代码编写。 安装 在使用 Node S…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部