JavaScript中图用邻接表(对象/Map+数组/Set)或邻接矩阵(二维数组)表示;常用DFS(递归/栈)和BFS(队列)遍历;带权图需Dijkstra等算法;开发优先选邻接表,注意有向/无向区别与序列化问题。
JavaScript 中的“图”(Graph)是一种非线性数据结构,由顶点(Vertex/Node)和边(Edge)组成,用来表示实体及其之间的关系。它不强调层级或顺序,而是灵活建模多对多、循环、路径依赖等场景,比如社交网络、网页跳转、城市路线、依赖关系图等。
图没有原生类型,常用两种方式手动实现:
const graph = {
A: ['B', 'C'],
B: ['A', 'D'],
C: ['A', 'D'],
D: ['B', 'C']
};
// 或用 Map + Set 避免重复和方便增删
const graphMap = new Map();
graphMap.set('A', new Set(['B', 'C']));
graphMap.set('B', new Set(['A', 'D']));
// 顶点按顺序映射为索引:A→0, B→1, C→2, D→3 const matrix = [ [0, 1, 1, 0], // A 连 B、C [1, 0, 0, 1], // B 连 A、D [1, 0, 0, 1], // C 连 A、D [0, 1, 1, 0] // D 连 B、C ];
图搜索目标通常是遍历所有可达节点、找路径、检测环或求最短距离。核心是避免重复访问,需用集合(Set)记录已访问节点。
function dfs(graph, start, visited = new Set()) {
if (visited.has(start)) return;
visited.add(start);
console.log(start);
for (const neighbor of graph[start] || []) {
dfs(graph, neighbor, visited);
}
}
function bfs(graph, start) {
const queue = [start];
const visited = new Set([start]);
while (queue.length > 0) {
const node = queue.shift();
console.log(node);
for (const neighbor of graph[node] || []) {
if (!visited.has(neighbor)) {
visited.add(neighbor);
queue.push(neighbor);
}
}
}
}
如果边有权重(如距离、耗时),基础 DFS/BFS 不再适用最短路径。此时需升级算法:
真实项目很少从零手写图算法,但理解底层很重要:
graphology(功能全、性能好)、cytoscape.js(侧重可视化)。