一文吃透JS树状结构的数据处理(增删改查)

一文吃透JS树状结构的数据处理(增删改查)

什么是树状结构

树状结构是一种经典的数据结构,在计算机领域中被广泛应用。树状结构由连通的节点组成,节点之间形成父子关系。一根树状结构的“根节点”没有父节点,每个子节点可以有多个“子节点”,但一个“子节点”只能有一个“父节点”。常见的应用包括文件系统、HTML DOM 和 JSON 数据格式等。

数据结构设计

我们以一个图书分类的树状结构为例进行说明,结构如下所示:

const data = [{
    id: 1,
    label: "文学",
    children: [{
        id: 2,
        label: "小说",
        children: [{
            id: 3,
            label: "现代小说"
          },
          {
            id: 4,
            label: "言情小说"
          }
        ]
      },
      {
        id: 5,
        label: "散文",
        children: [{
          id: 6,
          label: "古代散文"
        }]
      }
    ]
  },
  {
    id: 7,
    label: "科学",
    children: [{
      id: 8,
      label: "数学"
    }]
  }
];

我们可以看到每个节点都包含了一个 ID、标签和一个子节点数组。而子节点数组中的每个元素都是一个字典,包含了对应子节点的 ID、标签和子节点数组。

在开发过程中,我们经常需要对这样的树状结构做一些基本操作,如:增加、删除、修改、查找等。接下来,我们将分别讨论这些操作的实现方法。

增加节点

在上面的数据结构中,每个节点包含了一个固定格式的字典,我们可以通过以下方式来向树状结构中添加节点:

const addChild = (parentId, child) => {
  const parent = data.find(item => item.id === parentId);
  if (parent.children) {
    parent.children.push(child);
  } else {
    parent.children = [child];
  }
};

这个函数接收两个参数:parentId 代表要添加子节点的父节点 ID,child 代表要添加的子节点。首先我们通过 find 方法来查找 parent,然后判断是否已经有了子节点,如果有,就直接将新的子节点添加进去;如果没有,就新建一个空数组,再将子节点加入进去。

删除节点

删除节点是一个比较麻烦的操作,因为我们需要做到 “删除一个节点的同时,也要删除它的所有子节点”。下面是一个关于如何删除节点的示例:

const removeNode = (id) => {
  const recursive = (data, id) => {
    for (let i = 0; i < data.length; i++) {
      if (data[i].id === id) {
        data.splice(i, 1)
        break
      } else if (Array.isArray(data[i].children)) {
        recursive(data[i].children, id)
      }
    }
  }
  recursive(data, id)
}

这个函数接收一个 id 参数,表示要删除的节点 ID。它首先定义了一个内部递归函数 recursive,该函数接收两个参数,并进行递归删除节点操作。递归函数中,首先判断数组中元素的 id 是否等于传入的 id,如果等于就从数组中删除该元素;否则,递归遍历该元素的子节点,进行相同的操作。

修改节点

修改节点比增加和删除操作简单些。首先,我们需要找到要修改的节点,然后将其属性改为所需要的值即可。下面是一个示例代码:

const updateNode = (id, label) => {
  const update = (id, label, data) => {
    for (let i = 0; i < data.length; i++) {
      if (data[i].id === id) {
        data[i].label = label;
        break;
      } else if (Array.isArray(data[i].children)) {
        update(id, label, data[i].children)
      }
    }
  }
  update(id, label, data)
}

这个函数接收两个参数:id 表示要修改的节点 ID,label 表示要修改的标签。该函数通过递归遍历所有子节点,找到要修改的节点,然后进行修改。

查找节点

查找节点也是一项常见操作,我们可以通过递归来实现。下面是一个示例代码:

const findNode = (data, id) => {
  for (let i = 0; i < data.length; i++) {
    if (data[i].id === id) {
      return data[i];
    } else if (Array.isArray(data[i].children)) {
      const result = findNode(data[i].children, id);
      if (result !== null) {
        return result;
      }
    }
  }
  return null;
};

这个函数接收两个参数:data 表示要查找的数据,id 表示要查找的节点 ID。首先遍历每个节点,找到要查找的节点,返回该节点;否则,递归遍历该元素的所有子节点,查找相同的节点 ID。

总结

树状结构是一种非常常用的数据结构,因此在开发过程中,我们经常需要对树状数据进行增删改查的操作。上述这些操作可以通过递归遍历进行实现。同时,我们也可以通过不同方式修改这些操作的逻辑,例如使用深度优先遍历代替示例中的广度优先搜索。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文吃透JS树状结构的数据处理(增删改查) - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 详解C语言实现空间索引四叉树

    详解C语言实现空间索引四叉树攻略 四叉树是一种常见的空间索引方法,可以有效地处理二维或三维空间中的数据。本攻略将详细介绍使用C语言实现空间索引四叉树的方法,包括数据结构的设计,插入和查询操作的实现。 数据结构设计 结点结构体 struct QuadtreeNode { int depth; // 结点深度 double x, y; // 结点中心坐标 dou…

    数据结构 2023年5月17日
    00
  • 详解Java中字典树(Trie树)的图解与实现

    详解Java中字典树(Trie树)的图解与实现 一、什么是字典树(Trie树) 字典树,又称为Trie树,是一种树形数据结构。常用于统计和排序大量的字符串。它支持快速插入和查找,并且可以用于词频统计。 二、字典树的基本性质 根节点不包含字符,除根节点外每个节点都只包含一个字符。 从根节点到某个节点,路径上经过的字符连接起来,为该节点对应的字符串。 每个节点的…

    数据结构 2023年5月17日
    00
  • C语言深入浅出解析二叉树

    C语言深入浅出解析二叉树攻略 什么是二叉树 二叉树是一种树形数据结构,其每个节点最多只有两个子节点,分别称为其左子节点和右子节点。一般采用链式存储方式来实现二叉树,也可以使用数组来存储。 二叉树的遍历 二叉树的遍历分为三种方式:前序遍历,中序遍历和后序遍历。 前序遍历 前序遍历的顺序是先遍历根节点,然后遍历左子树,最后遍历右子树。可以使用递归或栈来实现。 v…

    数据结构 2023年5月17日
    00
  • 数据结构 数组顺序存储详细介绍

    数据结构数组顺序存储详细介绍 什么是数组顺序存储? 数组是最基本的数据结构之一,在计算机程序中使用广泛。在数组中,存储的元素类型相同且占用相同的内存空间,可以通过下标进行快速访问和修改。数组可以使用不同的方法来存储在内存中,其中最简单的方法是数组顺序存储。 数组顺序存储是指将元素按照顺序依次存储在内存中的一块连续地址中,可以方便地进行随机访问。这种方式与链式…

    数据结构 2023年5月17日
    00
  • java数据结构与算法数组模拟队列示例详解

    下面是“java数据结构与算法数组模拟队列示例详解”的完整攻略。 标题 Java数据结构与算法:数组模拟队列示例详解 简介 本文将以Java语言为例,详细讲解如何使用数组模拟队列。对于初学者来说,队列是一个非常基础的数据结构,掌握其实现方法可以帮助进一步理解其他的数据结构和算法。 队列的定义 队列(Queue)是一种先进先出(First In First O…

    数据结构 2023年5月17日
    00
  • Java数据结构之对象的比较

    Java数据结构之对象的比较 在Java中,对象的比较是非常重要的操作。我们常常需要对不同的对象进行比较,以便对它们进行排序、按照某个条件过滤等操作。本文将详细讲解Java中对象的比较,并给出一些示例来说明。 对象的比较方法 Java中有两种对象比较方法:值比较和引用比较。值比较就是比较两个对象的值是否相等,而引用比较是比较两个对象是否是同一个对象。 值比较…

    数据结构 2023年5月17日
    00
  • NTP时间同步服务器(频率同步)包含帧同步、载波同步、位同步

    NTP时间同步服务器(频率同步)包含帧同步、载波同步、位同步 NTP时间同步服务器(频率同步)包含帧同步、载波同步、位同步 京准电子科技官微——ahjzsz 同步的概念   同步技术是数字通信系统中非常重要的技术。一般来说数字通信系统要实现多种同步功能才能实现正确的数据通信任务。其技术目标是实现不同地域收发双方的同步通信互联,实现一致的信息数据交换,因此,通…

    算法与数据结构 2023年4月17日
    00
  • 算法总结–ST表

    声明(叠甲):鄙人水平有限,本文为作者的学习总结,仅供参考。 1. RMQ 介绍 在开始介绍 ST 表前,我们先了解以下它以用的场景 RMQ问题 。RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就是说,RMQ…

    算法与数据结构 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部