You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 00:39:03