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

生成无末尾0的产品序列号时出现重复值的问题排查

生成无末尾0的产品序列号时出现重复值的问题排查

别担心,这个问题其实是逻辑判断的小偏差导致的,咱们一步步拆解来看,很快就能解决~

先明确你的需求

你想要生成的序列号规则是:

  • 格式为「条形码 + 序号」
  • 序号需要跳过所有末尾为0的数字,也就是序列是 1,2,...,9,11,12,...,19,21,22,...(排除10、20、30这类数)

问题出在当前代码的逻辑上

你现在是通过数组ary的长度来推导下一个序号,但这个逻辑在生成到第10个之后就会出错,咱们走一遍实际调用的流程就清楚了:

  1. 前9次调用newy():数组长度从0到8,每次serial = 数组长度+1,生成1-9,完全没问题,数组最终长度为9
  2. 第10次调用:数组长度是9,9+1=10是10的倍数,所以你设置serial=9+2=11,生成了5673411,数组长度变为10
  3. 第11次调用:数组长度是10,10+1=11不是10的倍数,所以你设置serial=10+1=11——这就又生成了一遍5673411,重复问题就这么出现了!

核心问题在于:数组长度是「已生成的序列号数量」,但这个数量和实际的序号值并不是简单的+1关系——因为咱们跳过了10这个数,当数组长度为10时,实际已经跳过了1个数字,下一个序号应该是12,而不是11。

修复方案:追踪最后一个序号而非数组长度

正确的思路应该是:找到大于最后一个序号的最小的、不被10整除的数字,而不是基于数组长度计算。这里给你两种实现方式:

方式一:从数组最后一项解析序号(兼容已有代码结构)

barcode = '56734';
ary: string[] = [];
serial!: number;
finaly!: string;

newy() {
  if (this.ary.length === 0) {
    this.serial = 1;
  } else {
    // 从最后一个序列号里提取纯数字部分
    const lastSerialStr = this.ary[this.ary.length - 1].replace(this.barcode, '');
    let lastSerialNum = parseInt(lastSerialStr, 10);
    // 递增直到找到末尾不为0的数
    do {
      lastSerialNum++;
    } while (lastSerialNum % 10 === 0);
    this.serial = lastSerialNum;
  }
  this.finaly = this.barcode + this.serial.toString();
  this.ary.push(this.finaly);
  return this.ary;
}

方式二:直接维护最后一个序号变量(更高效)

这个版本不用每次解析字符串,直接用变量追踪最后一个合法序号,效率更高:

barcode = '56734';
ary: string[] = [];
lastSerial = 0; // 直接维护最后一个合法的序号数值

newy() {
  let nextSerial: number;
  do {
    this.lastSerial++;
    nextSerial = this.lastSerial;
  } while (nextSerial % 10 === 0);
  
  const finaly = this.barcode + nextSerial.toString();
  this.ary.push(finaly);
  return this.ary;
}

两种方式都能保证每次生成的序号都是符合规则的,不会出现重复的情况,你可以根据自己的代码习惯选择~

备注:内容来源于stack exchange,提问作者startup

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 07:48:02