如何解决JS中多角色需保持固定顺序且序号依次递增的逻辑问题
JS签名序号生成需求实现方案
核心逻辑是先为不同角色定义固定优先级权重(数值越小优先级越高),所有角色按优先级排序后从1开始依次赋值序号,即可满足优先级固定、同角色序号递增、新增同角色后续序号自动+1的要求。
首先定义全局角色优先级映射:
// 数值越小优先级越高 const ROLE_PRIORITY = { CONSENTEE: 0, GUARDIAN: 1, ASSENTEE: 2, COUNTERSIGNEE: 3 }
场景1:已有完整角色列表,批量生成序号
如果已经拿到所有需要排序的角色列表,直接按优先级排序后赋值序号即可:
/** * 生成角色对应的签名序号 * @param {string[]} roleList 原始角色数组 * @returns {Object[]} 带序号的角色列表,结构为[{role: 角色名, order: 序号}] */ function generateSignatureOrders(roleList) { // 按优先级排序,同优先级角色保持原有相对顺序 const sortedRoles = [...roleList].sort((a, b) => { return ROLE_PRIORITY[a] - ROLE_PRIORITY[b] }) // 按排序结果依次赋值序号 return sortedRoles.map((role, index) => ({ role, order: index + 1 })) }
测试示例
// 测试用例:1个CONSENTEE、2个GUARDIAN、2个ASSENTEE、1个COUNTERSIGNEE const testRoles = ['ASSENTEE', 'GUARDIAN', 'COUNTERSIGNEE', 'CONSENTEE', 'GUARDIAN', 'ASSENTEE'] console.log(generateSignatureOrders(testRoles)) // 输出结果的order依次为1、2、3、4、5、6,符合需求
场景2:支持动态新增角色,实时计算序号
如果需要动态新增角色,可以封装管理器类,新增时直接计算插入位置,避免全量重排:
class SignatureOrderManager { constructor() { // 按约束默认存在CONSENTEE this.roleList = ['CONSENTEE'] } /** * 新增角色 * @param {string} role 新增的角色名 * @returns {Object[]} 最新的角色序号列表 */ addRole(role) { const currentPriority = ROLE_PRIORITY[role] let insertIndex = 0 // 计算插入位置:优先级更高的角色数量 + 同角色已有的数量 for (const item of this.roleList) { const itemPriority = ROLE_PRIORITY[item] if (itemPriority <= currentPriority) { insertIndex++ } else { // 优先级更低的不用继续遍历 break } } // 插入到对应位置 this.roleList.splice(insertIndex, 0, role) return this.getOrderList() } // 获取当前所有角色的序号列表 getOrderList() { return this.roleList.map((role, index) => ({ role, order: index + 1 })) } }
测试示例
const manager = new SignatureOrderManager() manager.addRole('GUARDIAN') manager.addRole('ASSENTEE') console.log(manager.getOrderList()) // 输出:[{role:'CONSENTEE',order:1}, {role:'GUARDIAN',order:2}, {role:'ASSENTEE',order:3}] // 新增1个GUARDIAN manager.addRole('GUARDIAN') console.log(manager.getOrderList()) // 输出:[{role:'CONSENTEE',order:1}, {role:'GUARDIAN',order:2}, {role:'GUARDIAN',order:3}, {role:'ASSENTEE',order:4}],符合需求
内容的提问来源于stack exchange,提问作者Jakub
相关产品推荐
相关产品推荐

