@d-matrix/utils 1.28.0 → 1.28.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/array.d.ts CHANGED
@@ -39,8 +39,8 @@ export declare const getArrayOrUndefined: <T>(array?: T[] | null | undefined) =>
39
39
  * @param options.defaultNo 无可用序号时的默认值(默认1)
40
40
  * @returns 未被使用的最小正整数序号
41
41
  */
42
- export declare const calcUnusedMinSerialNumber: <T extends Record<string, unknown>>(list: T[], options: {
43
- fieldName: keyof T;
42
+ export declare function calcUnusedMinSerialNumber(list: any[], options: {
43
+ fieldName: string;
44
44
  prefix: string;
45
- defaultNo?: number | undefined;
46
- }) => number;
45
+ defaultNo?: number;
46
+ }): number;
package/dist/array.js CHANGED
@@ -91,39 +91,33 @@ export const getArrayOrUndefined = (array) => {
91
91
  * @param options.defaultNo 无可用序号时的默认值(默认1)
92
92
  * @returns 未被使用的最小正整数序号
93
93
  */
94
- export const calcUnusedMinSerialNumber = (list, options) => {
95
- // 1. 参数校验与默认值处理
94
+ export function calcUnusedMinSerialNumber(list, options) {
96
95
  const { fieldName, prefix, defaultNo = 1 } = options;
97
- if (!Array.isArray(list))
98
- return defaultNo; // 非数组直接返回默认值
99
- if (list.length === 0)
96
+ if (!(list === null || list === void 0 ? void 0 : list.length))
100
97
  return defaultNo;
101
- // 2. 正则匹配规则(通用化:前缀+数字)
102
- const serialNumberRegex = new RegExp(`^(${prefix})(\\d+)$`);
103
- // 记录已使用的序号(键:序号数字,值:标记已用)
104
- const usedSerialNumbers = {};
105
- // 3. 遍历列表,提取有效序号
106
- for (const item of list) {
107
- // 确保字段值是字符串且非空
108
- const fieldValue = item[fieldName];
109
- if (typeof fieldValue !== 'string' || fieldValue.trim() === '')
110
- continue;
111
- const matchResult = fieldValue.match(serialNumberRegex);
112
- if (matchResult) {
113
- const serialNumberStr = matchResult[2];
114
- const serialNumber = Number(serialNumberStr);
115
- // 确保提取的是有效数字(排除 NaN、非整数)
116
- if (Number.isInteger(serialNumber) && serialNumber > 0) {
117
- usedSerialNumbers[serialNumber] = true;
118
- }
98
+ // 获取所有匹配前缀的项目并提取序号
99
+ const serialNumbers = list
100
+ .map((item) => item[fieldName])
101
+ .filter((value) => typeof value === 'string' && value.startsWith(prefix))
102
+ .map((value) => {
103
+ const numPart = value.substring(prefix.length);
104
+ // 如果前缀后没有数字,则认为是序号1(或者根据业务需求处理)
105
+ if (numPart === '')
106
+ return 1;
107
+ const num = parseInt(numPart, 10);
108
+ return isNaN(num) ? 0 : num;
109
+ })
110
+ .filter((num) => num > 0)
111
+ .sort((a, b) => a - b);
112
+ // 如果没有匹配项,返回默认值
113
+ if (serialNumbers.length === 0)
114
+ return defaultNo;
115
+ // 找到第一个缺失的正整数
116
+ for (let i = 0; i < serialNumbers.length; i++) {
117
+ if (serialNumbers[i] !== i + 1) {
118
+ return i + 1;
119
119
  }
120
120
  }
121
- // 4. 查找未被使用的最小正整数
122
- const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER;
123
- for (let i = 1; i < MAX_SAFE_INTEGER; i++) {
124
- if (!usedSerialNumbers[i])
125
- return i;
126
- }
127
- // 5. 极端兜底(理论上不会执行)
128
- return defaultNo;
129
- };
121
+ // 如果序列完整,返回下一个数字
122
+ return serialNumbers.length + 1;
123
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@d-matrix/utils",
3
3
  "sideEffects": false,
4
- "version": "1.28.0",
4
+ "version": "1.28.2",
5
5
  "description": "A dozen of utils for Front-End Development",
6
6
  "main": "dist/index.js",
7
7
  "scripts": {