生成无末尾0的产品序列号时出现重复值的问题排查
生成无末尾0的产品序列号时出现重复值的问题排查
别担心,这个问题其实是逻辑判断的小偏差导致的,咱们一步步拆解来看,很快就能解决~
先明确你的需求
你想要生成的序列号规则是:
- 格式为「条形码 + 序号」
- 序号需要跳过所有末尾为0的数字,也就是序列是
1,2,...,9,11,12,...,19,21,22,...(排除10、20、30这类数)
问题出在当前代码的逻辑上
你现在是通过数组ary的长度来推导下一个序号,但这个逻辑在生成到第10个之后就会出错,咱们走一遍实际调用的流程就清楚了:
- 前9次调用
newy():数组长度从0到8,每次serial = 数组长度+1,生成1-9,完全没问题,数组最终长度为9 - 第10次调用:数组长度是9,
9+1=10是10的倍数,所以你设置serial=9+2=11,生成了5673411,数组长度变为10 - 第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
相关产品推荐
相关产品推荐

