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

相关文章

  • 字符串算法–$\mathcal{KMP,Trie}$树

    \(\mathcal{KMP算法}\) 实际上,完全没必要从\(S\)的每一个字符开始,暴力穷举每一种情况,\(Knuth、Morris\)和\(Pratt\)对该算法进行了改进,称为 \(KMP\) 算法。 而\(KMP\)的精髓在于,对于每次失配之后,我都不会从头重新开始枚举,而是根据我已经得知的数据,从某个特定的位置开始匹配;而对于模式串的每一位,都有…

    算法与数据结构 2023年4月18日
    00
  • 基于C++详解数据结构(附带例题)

    基于C++详解数据结构(附带例题)攻略 简介 该攻略是基于C++编程语言详解数据结构的,主要涉及数据结构中的相关概念、操作以及例题演练。C++语言作为一种高性能的编程语言,对于开发数据结构问题具有很大的优势。 数据结构概念 数据结构基本概念 数据结构是计算机存储、组织数据的方式。具体来说,数据结构可以理解为计算机存储数据的一种方式,也可以看作是一些组织数据的…

    数据结构 2023年5月17日
    00
  • C语言数据结构之堆、堆排序的分析及实现

    C语言数据结构之堆、堆排序的分析及实现 什么是堆 堆(Heap)是一种特殊的树形数据结构,它满足两个条件: 堆是一棵完全二叉树; 堆中任意节点的值总是不大于/不小于其子节点的值。 如果父节点的值不大于所有子节点的值,此堆称为小根堆,又称为最小堆。如果父节点的值不小于所有子节点的值,此堆称为大根堆,又称为最大堆。 堆通常可以使用数组来实现,具体实现方法是将堆的…

    数据结构 2023年5月17日
    00
  • C++数据结构与算法的基础知识和经典算法汇总

    C++数据结构与算法的基础知识和经典算法汇总 1. 基础知识 1.1 数据结构 数据结构是计算机存储、组织数据的方式。这里列出常见的数据结构,包括但不限于: 数组 链表 栈 队列 树 哈希表 1.2 算法 算法是解决问题的步骤和方法。下列是常见的算法: 排序算法 查找算法 字符串算法 图算法 1.3 复杂度 复杂度是算法性能的度量。常见的复杂度表示法有O(n…

    数据结构 2023年5月17日
    00
  • Java数据结构之HashMap和HashSet

    Java数据结构之HashMap和HashSet HashMap 介绍 HashMap是一种基于哈希表实现的Map集合,它提供了快速的插入、查询、删除操作。HashMap中存储的元素是以键值对(Key-Value)的形式存储的,其中Key是用来从Map中查找值的索引,Value是存储在Map中的值。HashMap中的Key和Value都可以为null,但是在…

    数据结构 2023年5月17日
    00
  • Java数据结构之二叉排序树的实现

    Java数据结构之二叉排序树的实现 二叉排序树(Binary Sort Tree)是一种特殊的二叉树结构,它的每个结点都包含一个关键字,并满足以下性质: 左子树中所有结点的关键字都小于根结点的关键字; 右子树中所有结点的关键字都大于根结点的关键字; 左右子树也分别为二叉排序树。 这种结构有助于实现快速的查找、插入和删除操作。在此,我们将展示一种实现二叉排序树…

    数据结构 2023年5月17日
    00
  • Go语言数据结构之选择排序示例详解

    Go语言数据结构之选择排序示例详解 什么是选择排序? 选择排序是一种简单的排序算法,它的基本思想是在待排序的数列中选择一个最小(或最大)的元素放到最前面,再在剩下的数列中选择一个最小(或最大)的元素放到已排序序列的末尾,以此类推,直到所有的元素都排序完毕。 其排序的时间复杂度为O(N²),在数据量较小的情况下使用起来非常方便。 选择排序的实现 下面我们来看一…

    数据结构 2023年5月17日
    00
  • C语言程序设计第五版谭浩强课后答案(第二章答案)

    首先,需要说明的是本题涉及到一个特定的知识领域,即C语言程序设计,以及该领域内某个具体教材的课后习题解答。因此,本攻略的重心将放在如何利用Markdown格式对该领域内的知识进行准确、清晰的表达和展示上。 下面是本攻略的目录: C语言程序设计第五版谭浩强课后答案(第二章答案)攻略 一、简介 二、题目列表 三、示例说明 示例一 示例二 四、总结 一、简介 本攻…

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