双向链表
用来构建流程状态链表,通过 map,构建链表结构,实现流程注册及上下级切换
/**
* @name 节点对象
* @param data 节点数据
* @param pre 上级节点
* @param next 下级节点
*/
class Node {
constructor(data, pre, next) {
this.data = data;
this.pre = pre;
this.next = next;
}
}
/**
* @name 链表对象
* @param headerNode 表头节点
*/
export class Linked {
constructor(headerNode) {
this.header = new Node(headerNode, null, null);
this.store = new Map();
this.store.set(headerNode.code, this.header);
}
/**
* @name 插入节点
* @param {obj} element
* @param {str} code 状态标号('1')
*/
insert(element, code) {
// 替换校验
if (this.find(element.code)) {
throw "该节点已被占用";
}
// 空值校验
if (code && !this.has(code)) {
throw "插入点不存在";
}
// 默认末尾插入
let currentNode = code ? this.find(code) : this.endNode();
let newNode = new Node(element, currentNode, currentNode.next);
currentNode.next = newNode;
this.store.set(element.code, newNode);
}
/**
* @name 节点是否存在
* @param {str} code
*/
has(code) {
return this.store.has(code);
}
/**
* @name 查询节点
* @param {str} code
* @return {Node} 返回节点
*/
find(code) {
return this.store.get(code);
}
/**
* @name 获取末端节点
* @return {Node} 返回末端节点
*/
endNode() {
let current = this.header;
while (current.next) {
current = current.next;
}
return current;
}
// 设置循环链表
setLoop() {
let endNode = this.endNode();
this.header.pre = endNode;
endNode.next = this.header;
}
}