JavaScript常见数据结构 - 汇总

0 阅读6分钟

1. 基本数据结构

数组 (Array)

const fruits = ['apple', 'banana', 'orange'];

特点:有序集合,索引访问,可包含不同类型元素

操作:push/pop/shift/unshift/slice/splice/map/filter/reduce等

应用场景:列表渲染、数据集合、队列/栈的实现

对象 (Object)

const person = {
  name: 'Alice',
  age: 25,
  isStudent: false
};

特点:键值对集合,无序,键必须是字符串或Symbol

操作:Object.keys/values/entries, 点表示法/方括号访问

应用场景:数据建模、配置对象、字典

Map

const map = new Map();
map.set('name', 'Bob');
map.set(1, 'number key');

核心特点

  • 键值对集合:与对象类似,但键可以是任意类型(包括对象、函数等)。
  • 顺序保留:键的顺序与插入顺序一致。
  • 方法丰富:支持 sizegetsethasdelete 等方法。

常见用途

  • 需要键为非字符串类型时(如对象作为键)。
  • 需要维护键的插入顺序时(如缓存实现)。
  • 替代对象作为哈希表(尤其是需要动态增删键值对时)。

Set

const set = new Set([1, 2, 3, 3, 4]); // [1, 2, 3, 4]

特点:值唯一,自动去重,快速查找

操作:add/delete/has/clear

应用场景:去重、集合运算、标签管理

2. 树形结构

DOM树

document.querySelector('div').children;

特点:节点包含父子关系,每个节点有parentNode/childNodes等属性

应用场景:页面渲染、DOM操作

虚拟DOM

const vNode = {
  tag: 'div',
  props: { id: 'app' },
  children: [
    { tag: 'span', props: {}, children: ['hello'] }
  ]
};

特点:轻量级JS对象表示,高效比对算法

应用场景:React/Vue等框架的核心

JSON树

// 二叉树
class TreeNode {
  constructor(value) {
    this.value = value;
    this.left = null;
    this.right = null;
  }
}
class BinaryTree {
  constructor() { this.root = null; }
  insert(value) {
    const newNode = new TreeNode(value);
    if (!this.root) { this.root = newNode; return; }
    let current = this.root;
    while (true) {
      if (value < current.value) {
        if (!current.left) { current.left = newNode; return; }
        current = current.left;
      } else {
        if (!current.right) { current.right = newNode; return; }
        current = current.right;
      }
    }
  }
}
const tree = new BinaryTree();
tree.insert(5);
tree.insert(3);

核心特点

  • 层次结构:由节点组成,每个节点可以有多个子节点,但只有一个父节点(根节点除外)。
  • 常见类型:二叉树、二叉搜索树、平衡树(如 AVL 树、红黑树)等。
  • 高效操作:搜索、插入、删除等操作的时间复杂度通常为 O(log n)。

常见用途

  • 表示 DOM 树或文件系统。
  • 实现搜索算法(如二叉搜索树)。
  • 数据库索引(如 B 树)。

3. 图结构

// 邻接表表示
class Graph {
  constructor() { this.adjacencyList = {}; }
  addVertex(vertex) {
    if (!this.adjacencyList[vertex]) { this.adjacencyList[vertex] = []; }
  }
  addEdge(vertex1, vertex2) {
    this.adjacencyList[vertex1].push(vertex2);
    this.adjacencyList[vertex2].push(vertex1); // 无向图
  }
}
const graph = new Graph();
graph.addVertex('A');
graph.addVertex('B');
graph.addEdge('A', 'B');

状态依赖图

核心特点

  • 节点和边:由节点(顶点)和边组成,用于表示对象之间的关系。
  • 类型:分为有向图和无向图。
  • 算法:常见操作包括遍历(DFS、BFS)、最短路径算法等。

常见用途

  • 社交网络关系。
  • 路径规划(如导航系统)。
  • 依赖关系管理(如构建工具)。

路由图

4. 特殊用途结构

// React Router配置
const routes = [
  { path: '/', component: Home },
  { path: '/about', component: About }
];

应用场景:前端路由管理

栈 (Stack)

class Stack {
  constructor() { this.items = []; }
  push(item) { this.items.push(item); }
  pop() { return this.items.pop(); }
}
const stack = new Stack();
stack.push(1);
stack.push(2);
console.log(stack.pop()); // 输出: 2

核心特点

  • 后进先出(LIFO) :元素只能从栈顶插入或删除。
  • 操作受限:主要支持 push(入栈)、pop(出栈)、peek(查看栈顶)等操作。
  • 时间复杂度:所有操作均为 O(1)。

常见用途

  • 函数调用栈(实现递归)。
  • 撤销操作(Undo)的实现。
  • 表达式求值(如括号匹配)。

应用场景:函数调用栈、撤销操作、路由历史

队列 (Queue)

// 用数组模拟
class Queue {
  constructor() { this.items = []; }
  enqueue(item) { this.items.push(item); }
  dequeue() { return this.items.shift(); }
}
const queue = new Queue();
queue.enqueue('A');
queue.enqueue('B');
console.log(queue.dequeue()); // 输出: 'A'

核心特点

  • 先进先出(FIFO) :元素从队尾插入,从队头删除。
  • 操作受限:主要支持 enqueue(入队)、dequeue(出队)、peek(查看队头)等操作。
  • 时间复杂度:所有操作均为 O(1)。

常见用途

  • 任务调度(如消息队列)。
  • 广度优先搜索(BFS)。
  • 打印任务队列。

链表

// 单链表
class Node {
  constructor(value) {
    this.value = value;
    this.next = null;
  }
}
class LinkedList {
  constructor() { this.head = null; }
  append(value) {
    const newNode = new Node(value);
    if (!this.head) { this.head = newNode; return; }
    let current = this.head;
    while (current.next) { current = current.next; }
    current.next = newNode;
  }
}
const list = new LinkedList();
list.append(1);
list.append(2);

核心特点

  • 节点组成:由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
  • 动态插入/删除:在已知节点的情况下,插入和删除操作高效(O(1))。
  • 随机访问低效:需要从头节点开始遍历(O(n))。

常见用途

  • 需要频繁插入和删除的场景(如动态数据管理)。
  • 实现栈、队列或图等数据结构的基础。

堆 (Heap)

堆是一种特殊的树形数据结构,具有完全二叉树的特性,广泛应用于计算机科学和前端开发中

核心特点:

完全二叉树结构:堆总是一棵完全二叉树,除了最后一层外,每一层都被完全填满,且节点尽可能向左对齐。

堆序性:堆分为大顶堆和小顶堆。在大顶堆中,父节点的值总是大于或等于其子节点的值;在小顶堆中,父节点的值总是小于或等于其子节点的值。

高效访问:堆顶元素(根节点)总是当前堆中的最大值(大顶堆)或最小值(小顶堆),可以在O(1)时间内访问。

存储方式

数组实现:堆通常使用数组来存储,通过计算父节点和子节点的索引来实现堆的操作。例如,若某节点在数组中的下标为i,则其左子节点的下标为2i+1,右子节点的下标为2i+2,父节点的下标为(i-1)/2。

常见操作

插入(Push) :将新元素插入到堆的末尾,然后通过向上调整(Shift Up)来恢复堆序性。插入操作的时间复杂度为O(log n)。

删除堆顶(Pop) :移除堆顶元素,将堆的最后一个元素移动到堆顶,然后通过向下调整(Shift Down)来恢复堆序性。删除操作的时间复杂度为O(log n)。

获取堆顶(Peek) :直接返回堆顶元素,时间复杂度为O(1)。

应用场景

优先队列:堆是实现优先队列的常用数据结构,例如在任务调度、事件驱动等场景中,可以高效地获取优先级最高的任务。

堆排序:利用堆的特性,可以实现高效的堆排序算法,时间复杂度为O(n log n)。

Top K问题:在需要快速获取数据集中前K个最大或最小元素的场景中,堆是一种高效的解决方案。

中位数和百分位数统计:通过维护两个堆(一个大顶堆和一个小顶堆),可以高效地统计数据的中位数或百分位数。

优缺点

优点:堆的插入和删除操作高效,适合动态数据场景;堆顶元素可以快速访问,适合优先队列等场景。

缺点:堆的随机访问效率较低,不适合需要频繁随机访问的场景;堆的实现相对复杂,需要维护堆序性。

5. 类型化数组

TypedArray

const buffer = new ArrayBuffer(16);
const int32View = new Int32Array(buffer);

特点:处理二进制数据,高性能

应用场景:WebGL、Canvas、音视频处理