优先级调度用对象数组实现,每个任务含name、priority和data;按priority升序排序并用_order保证稳定性;封装为PriorityQueue类支持enqueue/dequeue操作。

用数组实现优先级调度,核心是把任务和它的优先级绑定,再按优先级排序,让高优任务先执行。关键不在数组本身,而在如何组织数据结构、定义比较规则、稳定处理相同优先级的情况。
用对象数组承载任务与优先级
不要只存数字或字符串,每个任务应封装成对象,明确包含 name(标识)、priority(数值越小通常越高)和可选的 data(负载)。例如:
const tasks = [
{ name: 'log', priority: 10, data: { level: 'error' } },
{ name: 'notify', priority: 1, data: { user: 'admin' } },
{ name: 'backup', priority: 5, data: { path: '/tmp' } }
];
这样后续排序、提取、执行都清晰可控,避免靠索引硬编码导致维护困难。
按优先级升序排序并保持稳定性
JavaScript 的 Array.prototype.sort() 默认转字符串比较,必须传入比较函数。优先级数字越小越先执行,所以用 a.priority - b.priority 实现升序:
- 若返回负数 → a 排在 b 前面
- 若返回 0 → 顺序不变(现代引擎大多保持原序,但不绝对)
- 若返回正数 → b 排在 a 前面
为真正保证相同优先级任务的原始顺序(即稳定性),可额外记录插入序号:
tasks.forEach((t, i) => t._order = i);
tasks.sort((a, b) => a.priority - b.priority || a._order - b._order);
封装成可复用的调度队列类
把入队、排序、出队逻辑收拢,避免每次手动调 sort:
class PriorityQueue {
constructor() { this.items = []; this.counter = 0; }
enqueue(task, priority) {
this.items.push({ ...task, priority, _order: this.counter++ });
}
dequeue() {
this.items.sort((a, b) => a.priority - b.priority || a._order - b._order);
return this.items.shift();
}
size() { return this.items.length; }
}
使用时只需 queue.enqueue({ name: 'retry' }, 2),调用 dequeue() 就拿到当前最高优任务。
实战中注意变量处理顺序的边界情况
真实场景中,变量可能动态变化、重复入队、或需延迟执行。几个实用建议:
- 入队前检查是否已存在同名任务(用 Map 缓存 id → index),避免堆积
- priority 支持函数形式:如 priority: () => user.isAdmin ? 1 : 8,便于运行时计算
- 不直接修改原数组排序,而是生成新有序副本用于展示或调试,保留原始顺序供审计
- 对异步任务,dequeue 后应标记为 pending,防止重复调度
不复杂但容易忽略。数组是载体,逻辑才是重点——理清谁该先、谁可缓、谁要排重,优先级调度就自然成立。










