一文吃透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日

相关文章

  • Java数据结构之图的路径查找算法详解

    Java数据结构之图的路径查找算法详解 什么是图? 在计算机科学中,图是一种非常常见的数据结构,用于表示图形和网络等概念。图由节点和边组成,其中节点表示实体,边表示这些实体之间的关系。节点和边可以表示各种各样的实体和关系,因此图在计算机科学中具有广泛的应用。 图的路径查找算法 路径查找算法是一个用途广泛的算法,它用于查找从一个节点到另一个节点的路径。在图中,…

    数据结构 2023年5月17日
    00
  • [paper reading]|IC-FPS: Instance-Centroid Faster Point Sampling Module for 3D Point-base

    摘要: 本文说首次实现了大规模点云场景中基于点的模型的实时检测(<30ms); 首先指出FPS采样策略进行下采样是耗时的,尤其当点云增加的时候,计算量和推理时间快速增加; 本文提出IC-FPS;包含两个模块:local feature diffusion based background point filter (LFDBF);Centroid In…

    算法与数据结构 2023年4月17日
    00
  • CSP-何以包邮?

    题目描述 新学期伊始,适逢顿顿书城有购书满 x 元包邮的活动,小 P 同学欣然前往准备买些参考书。一番浏览后,小 P 初步筛选出 n 本书加入购物车中,其中第 i 本(1≤i≤n)的价格为 ai 元。考虑到预算有限,在最终付款前小 P 决定再从购物车中删去几本书(也可以不删),使得剩余图书的价格总和 m 在满足包邮条件(m≥x)的前提下最小。 试帮助小 P …

    算法与数据结构 2023年5月11日
    00
  • 用C语言实现单链表的各种操作(一)

    “用C语言实现单链表的各种操作(一)”详细介绍了如何通过C语言来实现单链表的常见操作。下面,我会结合该文章的内容,对其进行完整攻略的介绍。 文章的主要内容包括:单链表的定义、单链表的初始化、判断单链表是否为空、获取单链表中元素个数、在链表开头插入元素、在链表末尾插入元素、在链表中间插入元素、删除链表中指定元素、在链表中查找指定元素、链表的反转以及链表的销毁。…

    数据结构 2023年5月17日
    00
  • 在matlab中创建类似字典的数据结构方式

    当需要使用类似字典的数据结构时,Matlab中可以使用结构体来实现。结构体是一种有序的数据集合,每个元素都可以包含不同类型的数据(如字符串、数值等),并通过指定一个名称来唯一地标识该元素。 创建一个空结构体 使用struct函数可以创建一个空的结构体,可以使用下面的代码: st = struct; 添加键值对 可以将键值对添加到结构体中,可以使用下面的代码向…

    数据结构 2023年5月17日
    00
  • C++数据结构之链表的创建

    C++中链表的创建一般可分为以下几个步骤: 创建节点结构体 创建链表类,定义私有变量头结点(head)和一些公有方法,如插入、删除和打印链表等 实现链表的插入、删除和打印方法 下面将会对以上每个步骤进行详细讲解。 1. 创建节点结构体 节点结构体包含两个部分,一个是存储数据的变量,另一个是存储指向下一个节点的指针。代码如下: struct Node { in…

    数据结构 2023年5月17日
    00
  • C语言从猜数字游戏中理解数据结构

    C语言从猜数字游戏中理解数据结构 介绍 在游戏和编程之间有着密切的关系。猜数字游戏是一个经典的小游戏,它也可以作为学习数据结构的一个好教材。 在猜数字游戏中,你可以根据计算机所选数字的提示来猜出正确的数字。这个游戏可以帮助你更好地理解数据结构和算法。 游戏规则 1.计算机系统选择一个要猜的数字。 2.你需要猜出这个数字,计算机每次将你的猜测数字与要猜的数字进…

    数据结构 2023年5月17日
    00
  • C语言线性表顺序存储结构实例详解

    C语言线性表顺序存储结构实例详解 线性表的定义 线性表是数据结构中最基本的结构之一。它们是由相同数据类型的一组数据元素组成的序列。线性表具有唯一的首元素和唯一的末元素,除第一个元素之外的每个元素都有唯一的前继,除最后一个元素之外的每个元素都有唯一的后继。 线性表的存储方式 线性表有两种存储方式: 顺序存储和链式存储。 顺序存储采用一段连续的内存空间来存储线性…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部