Skip to content

前端数据结构

前端数据结构可按 “基础内置”“复合扩展”“特殊场景优化” 三类划分

内置的数据结构(四个)

shell
# 1、数组(Array)
核心特点:有序集合,支持索引访问,长度动态可变。
关键操作:push/pop(尾操作 O (1))、shift/unshift(头操作 O (n))、slice/splice(截取 / 修改 O (n))。
适用场景:列表展示(如商品列表)、有序数据存储(如表单选项)。适合查询

# 2、集合(唯一值) Set/WeakSet
核心特点:无序不重复集合,元素可设为任意类型。
关键操作:add/has/delete 均为 O (1),自动去重,支持 forEach 遍历。
适用场景:数据去重(如标签去重)、存储不重复的 ID 集合。适合增删改

# 3、对象(Object)
核心特点:键值对集合,键为字符串 / Symbol,无序(ES6 后插入顺序可遍历)。
关键操作:属性访问 O (1)、新增 / 删除属性 O (1),遍历需手动处理原型链。
适用场景:存储实体信息(如用户信息、配置项)。

# 4、字典(键值对) Map/WeakMap
核心特点:键值对集合,键可设为任意类型(函数、对象等),有序,支持直接遍历。
关键操作:get/set/has/delete 均为 O (1),支持 size 属性快速获取长度。
适用场景:需要非字符串键(如用 DOM 元素作键)、频繁增删且需遍历的场景。

# 注意
WeakMap/WeakSet
核心特点:弱引用,键 / 元素为对象时不影响垃圾回收(GC),无 size 属性。
适用场景:临时缓存(如 DOM 元素关联数据)、避免内存泄漏的场景。

复合扩展数据结构(八个)

基于原生封装,适配特定逻辑

shell
# 1、栈(Stack)
核心特点:遵循 “后进先出(LIFO)”,仅操作栈顶元素。
实现方式:基于数组的 push(入栈)、pop(出栈)方法封装。
适用场景:函数调用栈、路由回退(历史记录)、表达式解析。

# 2、队列(Queue)
核心特点:遵循 “先进先出(FIFO)”,操作队首(出队)和队尾(入队)。
实现方式:基于数组的 push(入队)、shift(出队)或链表优化(避免 shift O (n) 开销)。
适用场景:异步任务队列(如 Promise 队列)、消息通知队列。

# 3、链表(LinkedList)
核心特点:线性结构,元素(节点)通过指针关联,无需连续内存。
类型:单向链表(仅指向下一节点)、双向链表(前后节点互指)。
适用场景:频繁增删的长列表(如虚拟列表的节点管理)、避免数组扩容开销。

# 4、树(Tree)
核心特点:层级结构,有根节点、子节点,无环(前端以二叉树、多叉树为主)。
关键类型:二叉树(每个节点最多两子节点)、DOM 树(多叉树)、组件树(多叉树)。
适用场景:DOM 操作、组件渲染、树形菜单 / 表格、路由树(Vue Router/React Router)。

# 5、图(Graph)
核心特点:由顶点和边组成,支持有向 / 无向、加权 / 无权。
实现方式:邻接矩阵(二维数组)或邻接表(对象 / 数组)。
适用场景:路由跳转关系(有向图)、依赖关系分析(如 Webpack 模块依赖)。

# 6、哈希表(Hash Table)
核心特点:通过哈希函数将键映射到存储位置,查询 / 增删 O (1)(理想情况)。
前端关联:Object、Map 的底层实现本质是哈希表(解决键值映射)。
适用场景:常见数据查询(如缓存池)、字典映射(如中英文翻译)。

# 7、堆(Heap)
核心特点:完全二叉树结构,分为大顶堆(父节点≥子节点)、小顶堆(父节点≤子节点)。
关键操作:插入 O (log n)、删除堆顶 O (log n),支持快速获取极值。
适用场景:优先级队列(如高优先级异步任务)、Top K 问题(如获取销量前 10 商品)。

# 8、布隆过滤器(Bloom Filter)
核心特点:空间高效的概率型数据结构,用于判断 “元素是否存在”(有假阳性,无假阴性)。
实现方式:基于位数组 + 多个哈希函数。
适用场景:缓存穿透防护、重复请求拦截、大规模数据去重(如用户 ID 去重)。

使用场景

shell
简单键值映射(字符串键):用 Object(简洁,原生支持)
非字符串键 / 频繁增删遍历:用 Map(性能更优)
数据去重 / 快速判断存在:用 Set(O (1) 操作,比数组 indexOf 高效)
先进后出操作(如路由回退):用栈(Stack)
先进先出操作(如异步任务队列):用队列(Queue)
层级数据(如 DOM 树、组件树):用树(Tree)
优先级任务调度(如高优先级异步任务):用堆(Heap)
大规模数据去重 / 缓存穿透防护:用布隆过滤器(空间高效)
频繁增删的长列表:用链表(LinkedList)(避免数组平移开销)