yunlin 1.0.19 → 1.0.21

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/src/utils.js DELETED
@@ -1,545 +0,0 @@
1
-
2
-
3
- /**
4
- * 格式化数字,添加千分位分隔符。
5
- * 支持数字和字符串类型的数字输入。
6
- * 如果输入无效,返回空字符串。
7
- *
8
- * @param {number|string} num - 要格式化的数字或数字字符串。
9
- * @return {string} 格式化后的带千分位分隔符的字符串,或空字符串(如果输入无效)。
10
- */
11
- function fmtNum(num) {
12
- if (num == 0) return '0'
13
- if (!num) return ''
14
-
15
- // 尝试将输入转换为数字,如果输入是字符串则使用parseFloat进行转换
16
- let number = typeof num === 'string' ? parseFloat(num) : num;
17
- // 检查转换后的值是否为有效数字
18
- if (isNaN(number)) {
19
- // 如果转换失败,返回空字符串
20
- return '';
21
- }
22
- // 使用 toLocaleString 方法格式化数字,添加千分位分隔符
23
- // 设置国际化选项:使用美国英语格式,小数部分显示0至2位
24
- return number.toLocaleString('en-US', {
25
- minimumFractionDigits: 0,
26
- maximumFractionDigits: 2
27
- });
28
- }
29
-
30
- /**
31
- * 分割全名成姓和名
32
- * @param {string} fullName - 待处理的完整姓名
33
- * @param {boolean} [isEn=false] - 指示姓名是否为英文格式,默认为false表示中文姓名
34
- * @returns {object} 返回一个对象,包含姓(surname)和名(givenName)
35
- */
36
- function splitName(fullName, isEn = false) {
37
- // 初始化结果对象,用于存储姓和名
38
- let result = {
39
- surname: '', // 姓
40
- givenName: '' // 名
41
- };
42
- // 如果是英文姓名
43
- if (isEn) {
44
- // 英文姓名通常格式为 "SURNAME, GIVEN NAME(S)"
45
- // const parts = fullName.split(','); // 使用逗号分割姓名
46
- // 使用逗号分割姓名,如果没有逗号 以空格分隔
47
- const parts = fullName.includes(',') ? fullName.split(',') : fullName.split(/\s+/);
48
- if (parts.length >= 2) {
49
- // 移除前后空白字符并分配给姓和名
50
- result.surname = parts[0].trim(); // 第一部分为姓
51
- result.givenName = parts[1].trim(); // 第二部分为名
52
- }
53
- } else {
54
- // 定义中文复姓列表
55
- const surnames = [
56
- "欧阳", "太史", "端木", "上官", "司马", "东方", "独孤", "南宫", "万俟", "闻人",
57
- "夏侯", "诸葛", "尉迟", "公羊", "赫连", "澹台", "皇甫", "宗政", "濮阳", "公冶",
58
- "太叔", "申屠", "公孙", "慕容", "仲孙", "钟离", "长孙", "宇文", "司徒", "鲜于",
59
- "司空", "闾丘", "子车", "亓官", "司寇", "巫马", "公西", "颛孙", "壤驷", "公良",
60
- "漆雕", "乐正", "宰父", "谷梁", "拓跋", "夹谷", "轩辕", "令狐", "段干", "百里",
61
- "呼延", "东郭", "南门", "羊舌", "微生", "公户", "公玉", "公仪", "梁丘", "公仲",
62
- "公上", "公门", "公山", "公坚", "左丘", "公伯", "西门", "公祖", "第五", "公乘",
63
- "贯丘", "公皙", "南荣", "东里", "东宫", "仲长", "子书", "子桑", "即墨", "达奚",
64
- "褚师", "吴铭",
65
- // 繁体(如果有不同的写法)
66
- "歐陽", "太史", "端木", "上官", "司馬", "東方", "獨孤", "南宮", "萬俟", "聞人",
67
- "夏侯", "諸葛", "尉遲", "公羊", "赫連", "澹臺", "皇甫", "宗政", "濮陽", "公冶",
68
- "太叔", "申屠", "公孫", "慕容", "仲孫", "鐘離", "長孫", "宇文", "司徒", "鮮於",
69
- "司空", "閭丘", "子車", "亓官", "司寇", "巫馬", "公西", "顓孫", "壤駟", "公良",
70
- "漆雕", "樂正", "宰父", "穀梁", "拓跋", "夾谷", "軒轅", "令狐", "段幹", "百里",
71
- "呼延", "東郭", "南門", "羊舌", "微生", "公戶", "公玉", "公儀", "梁丘", "公仲",
72
- "公上", "公門", "公山", "公堅", "左丘", "公伯", "西門", "公祖", "第五", "公乘",
73
- "貫丘", "公皙", "南榮", "東里", "東宮", "仲長", "子書", "子桑", "即墨", "達奚",
74
- "褚師", "吳銘"
75
- ];
76
- // 尝试查找复姓
77
- for (let i = 0; i < surnames.length; i++) {
78
- const surname = surnames[i];
79
- // 如果全名以某个复姓开头
80
- if (fullName.startsWith(surname)) {
81
- // 设置姓为该复姓,名则为复姓之后的部分
82
- result.surname = surname;
83
- result.givenName = fullName.substring(surname.length).trim();
84
- return result; // 找到后立即返回结果
85
- }
86
- }
87
- // 如果没有找到复姓,处理单姓的情况
88
- const parts = fullName.split(' '); // 使用空格分割姓名
89
- if (parts.length === 1) {
90
- // 如果没有空格分隔,使用正则表达式来识别第一个汉字作为姓
91
- const surnameMatch = fullName.match(/[\u4e00-\u9fa5]/); // 匹配第一个汉字
92
- result.surname = surnameMatch ? surnameMatch[0] : ''; // 设置姓
93
- // 移除姓后的剩余部分作为名
94
- result.givenName = fullName.replace(result.surname, '').trim();
95
- } else {
96
- // 如果有空格分隔,第一部分作为姓,剩余部分作为名
97
- result.surname = parts[0]; // 第一部分为姓
98
- result.givenName = parts.slice(1).join(' '); // 其余部分为名
99
- }
100
- }
101
- return result;
102
- }
103
-
104
-
105
- /**
106
- * 将指定键名替换成另外的键名
107
- * strCode:原始键名
108
- * code:新键名
109
- */
110
- function modifyKeys(array, keyMap = {
111
- strCode: "code",
112
- strFjbh: "fjbh",
113
- strGuid: "value",
114
- strValue: "label"
115
- }) {
116
- if (!array.length || array === null) return []
117
- // 遍历数组中的每个对象
118
- const modifiedArray = array.map(obj => {
119
- const modifiedObj = {};
120
- // 遍历对象的键
121
- for (const key in obj) {
122
- if (keyMap.hasOwnProperty(key)) {
123
- // 如果键在映射表中有对应的新键名,则使用新键名
124
- modifiedObj[keyMap[key]] = obj[key];
125
- } else {
126
- // 否则保持原始键名
127
- modifiedObj[key] = obj[key];
128
- }
129
- }
130
- return modifiedObj;
131
- });
132
- return modifiedArray;
133
- }
134
-
135
- /**
136
- * 对数组进行切片处理
137
- * data:需要处理的数组
138
- * quantity:需要切割的数量
139
- * fromFront:是从前还是从后面切,默认从后
140
- */
141
- function sliceArray(data, quantity, fromFront) {
142
- if (quantity <= 0) {
143
- console.error("Quantity should be greater than 0.");
144
- return [];
145
- }
146
- if (fromFront) {
147
- return data.slice(0, quantity);
148
- } else {
149
- return data.slice(-quantity);
150
- }
151
- }
152
-
153
-
154
- /**
155
- * 判断指定键名的值是否在数组内
156
- * @param {*} inputArray 源数组
157
- * @param {*} target 需要匹配的值
158
- * @param {*} key 键名
159
- */
160
- function findDataByData(inputArray, target, key) {
161
- const foundData = inputArray.find(item => item[key] === target);
162
- return foundData || null;
163
- }
164
-
165
- /**
166
- * 分割数组
167
- */
168
- function splitArray(arr, n) {
169
- const result = [];
170
- for (let i = 0; i < arr.length; i += n) {
171
- result.push(arr.slice(i, i + n));
172
- }
173
- return result;
174
- }
175
-
176
-
177
- /**
178
- * 获取proxy的数据类型
179
- */
180
- function getProxyType(value) {
181
- return Object.prototype.toString.call(value).slice(8, -1);
182
- }
183
-
184
-
185
- let timeout = null
186
- /**
187
- * 防抖原理:一定时间内,只有最后一次操作,再过wait毫秒后才执行函数
188
- *
189
- * @param {Function} func 要执行的回调函数
190
- * @param {Number} wait 延时的时间
191
- * @param {Boolean} immediate 是否立即执行
192
- * @return null
193
- */
194
- function debounce(func, wait = 500, immediate = false) {
195
- // 清除定时器
196
- if (timeout !== null) clearTimeout(timeout)
197
- // 立即执行,此类情况一般用不到
198
- if (immediate) {
199
- const callNow = !timeout
200
- timeout = setTimeout(() => {
201
- timeout = null
202
- }, wait)
203
- if (callNow) typeof func === 'function' && func()
204
- } else {
205
- // 设置定时器,当最后一次操作后,timeout不会再被清除,所以在延时wait毫秒后执行func回调方法
206
- timeout = setTimeout(() => {
207
- typeof func === 'function' && func()
208
- }, wait)
209
- }
210
- }
211
-
212
- /**
213
- * 判断指定键名的值是否在数组内
214
- */
215
- function matchKeyValueInArray(arr, key, value) {
216
- for (let i = 0; i < arr.length; i++) {
217
- if (arr[i][key] === value) {
218
- return true;
219
- }
220
- }
221
- return false;
222
- }
223
-
224
-
225
- /**
226
- * 对象转URL
227
- * @param {object} obj
228
- */
229
- function urlEncode(obj = {}) {
230
- const result = []
231
- for (const key in obj) {
232
- const item = obj[key]
233
- if (!item) {
234
- continue
235
- }
236
- if (isArray(item)) {
237
- item.forEach(val => {
238
- result.push(key + '=' + val)
239
- })
240
- } else {
241
- result.push(key + '=' + item)
242
- }
243
- }
244
- return result.join('&')
245
- }
246
-
247
- /**
248
- * 比较日期大小
249
- * @param {Object} date1
250
- * @param {Object} date2 默认当日
251
- */
252
- function compareDates(date1, date2) {
253
- date1 = new Date(date1);
254
- if (!date2) {
255
- date2 = new Date();
256
- } else {
257
- date2 = new Date(date2);
258
- }
259
- date1.setHours(0, 0, 0, 0); // 将时间部分设置为0
260
- date2.setHours(0, 0, 0, 0); // 将时间部分设置为0
261
- // 将日期转换为时间戳进行比较
262
- var timeStamp1 = date1.getTime();
263
- var timeStamp2 = date2.getTime();
264
- if (timeStamp1 < timeStamp2) {
265
- return -1; // date1 小于 date2
266
- } else if (timeStamp1 > timeStamp2) {
267
- return 1; // date1 大于 date2
268
- } else {
269
- return 0; // date1 等于 date2
270
- }
271
- }
272
-
273
- /**
274
- * 获取2个日期间的天数
275
- * @param {Object} date1
276
- * @param {Object} date2
277
- */
278
- function getDaysBetween(date1, date2) {
279
- // 将日期字符串转换为Date对象
280
- const d1 = new Date(date1);
281
- const d2 = new Date(date2);
282
-
283
- // 计算两个日期之间的毫秒数
284
- const diff = Math.abs(d1.getTime() - d2.getTime());
285
-
286
- // 将毫秒数转换为天数
287
- const days = Math.floor(diff / (1000 * 60 * 60 * 24));
288
-
289
- return days + 1; // 包括起始日期和结束日期,所以需要加1
290
- }
291
-
292
-
293
- /**
294
- * 转中文大写
295
- * @param {Object} num
296
- */
297
- function chineseNumeral(num) {
298
- const numerals = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
299
- const units = ['', '拾', '佰', '仟'];
300
- const scales = ['', '万', '亿', '兆'];
301
-
302
- let integerPart = Math.floor(num);
303
- let decimalPart = Math.round((num - integerPart) * 100); // 取小数点后两位的整数表示
304
- let str = '';
305
-
306
- // 转换整数部分
307
- for (let i = 0; integerPart > 0; i++) {
308
- let temp = '';
309
- let section = integerPart % 10000;
310
- integerPart = Math.floor(integerPart / 10000);
311
-
312
- for (let j = 0; section > 0; j++) {
313
- let digit = section % 10;
314
- temp = (digit ? numerals[digit] + units[j] : '') + temp;
315
- section = Math.floor(section / 10);
316
- }
317
- str = temp + (temp ? scales[i] : scales[i] && !str.includes('零') ? '零' : '') + str;
318
- }
319
- str += str ? '元' : '零元';
320
- // 转换小数部分
321
- if (decimalPart > 0) {
322
- let jiao = Math.floor(decimalPart / 10);
323
- let fen = decimalPart % 10;
324
- str += (jiao ? numerals[jiao] + '角' : '') + (fen ? numerals[fen] + '分' : '');
325
- } else {
326
- str += '整';
327
- }
328
-
329
- return str.replace(/零{2,}/g, '零').replace(/零元/, '元');
330
- }
331
-
332
-
333
- /**
334
- * 获取月份所有日期
335
- * @param {*} monthYear 月份,格式为2024-2或2024-02 不传或者空字符串则返回当月
336
- */
337
- function getMonthDate(monthYear) {
338
- if (!monthYear || monthYear.trim() === '') {
339
- monthYear = `${new Date().getFullYear()}-${new Date().getMonth() + 1}`;
340
- }
341
- let dates = [];
342
- let [year, month] = monthYear.split('-').map(Number);
343
- let date = new Date(year, month, 0);
344
- let days = date.getDate();
345
-
346
- for (let i = 1; i <= days; i++) {
347
- let day = i < 10 ? `0${i}` : `${i}`;
348
- let monthFormatted = month < 10 ? `0${month}` : `${month}`;
349
- dates.push({
350
- date: `${year}-${monthFormatted}-${day}`,
351
- disable: true
352
- });
353
- }
354
- return dates;
355
- }
356
-
357
- function getToday(date) {
358
- var today = new Date();
359
- var dd = String(today.getDate()).padStart(2, '0');
360
- var mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0!
361
- var yyyy = today.getFullYear();
362
- today = yyyy + '-' + mm + '-' + dd
363
- return today
364
- }
365
-
366
-
367
-
368
-
369
-
370
- /**
371
- * 重置对象
372
- * @param {Object} obj
373
- */
374
- function resetObject(val) {
375
- let obj = JSON.parse(JSON.stringify(val))
376
- for (const key in obj) {
377
- if (typeof obj[key] === 'number') {
378
- obj[key] = 0;
379
- } else if (typeof obj[key] === 'boolean') {
380
- obj[key] = false;
381
- } else if (Array.isArray(obj[key])) {
382
- obj[key] = [];
383
- } else if (typeof obj[key] === 'object' && obj[key] !== null) {
384
- // 递归调用以处理嵌套对象
385
- resetObject(obj[key]);
386
- } else {
387
- obj[key] = '';
388
- }
389
- }
390
- return obj
391
- }
392
-
393
- /**
394
- * 精确运算函数,解决浮点数计算精度丢失问题。
395
- * 该函数接受两个数字和一个操作符(1: 加法, 2: 减法, 3: 乘法, 4: 除法),
396
- * 通过将浮点数转换为整数进行计算,再转换回浮点数得到相对精确的结果。
397
- * @param {number} a - 参与运算的第一个数字
398
- * @param {number} b - 参与运算的第二个数字
399
- * @param {number} operator - 表示运算类型的数字,1为加法,2为减法,3为乘法,4为除法
400
- * @returns {number} - 根据操作符计算得到的结果
401
- */
402
- function preciseOperation(a, b, operator, precisionFactor = 1000000) {
403
- // 处理特殊值NaN
404
- if (isNaN(a) || isNaN(b)) {
405
- return NaN;
406
- }
407
- // 处理无穷大
408
- if (!isFinite(a) || !isFinite(b)) {
409
- return NaN;
410
- }
411
- let num1 = BigInt(Math.round(a * precisionFactor));
412
- let num2 = BigInt(Math.round(b * precisionFactor));
413
- let result;
414
- switch (operator) {
415
- case 1:
416
- result = num1 + num2;
417
- break;
418
- case 2:
419
- result = num1 - num2;
420
- break;
421
- case 3:
422
- result = num1 * num2;
423
- break;
424
- case 4:
425
- if (num2 === 0n) {
426
- throw new Error('除数不能为0');
427
- }
428
- result = num1 / num2;
429
- break;
430
- default:
431
- throw new Error('无效的操作符,操作符应为1、2、3或4');
432
- }
433
- return Number(result) / precisionFactor;
434
- }
435
-
436
-
437
-
438
-
439
- /**
440
- * 使用精确运算函数计算数组内所有元素的总和。
441
- * 如果数组中的元素是字符串形式的数字,则尝试将其转换为数字;
442
- * 如果转换失败或元素是 null/undefined,则将该元素视为 0。
443
- * @param {Array} numbers - 数字或字符串形式的数字数组
444
- * @returns {number} - 数组内所有元素的总和
445
- */
446
- function preciseSum(numbers) {
447
- // 初始化总和为0
448
- let sum = 0;
449
- // 遍历数组中的每个元素
450
- for (const num of numbers) {
451
- let currentNum = 0; // 默认值为0
452
- // 尝试将元素转换为数字
453
- if (typeof num === 'string') {
454
- const parsedNum = parseFloat(num);
455
- if (!isNaN(parsedNum)) {
456
- currentNum = parsedNum;
457
- }
458
- } else if (typeof num === 'number') {
459
- currentNum = num;
460
- }
461
- // 使用 preciseOperation 进行加法操作
462
- sum = preciseOperation(sum, currentNum, 1); // 1 表示加法
463
- }
464
- return sum;
465
- }
466
-
467
- /**
468
- * 获取指定日期的前后时间
469
- * @param {Object} dateStr 指定日期
470
- * @param {Object} days 天数
471
- */
472
- function getRelativeDate(dateStr, days = 0) {
473
- const date = new Date(dateStr);
474
- date.setDate(date.getDate() + days); // 在日期上加上指定的天数,负数则减去天数
475
-
476
- // 将日期转换回 YYYY-MM-DD 格式
477
- const year = date.getFullYear();
478
- const month = (date.getMonth() + 1).toString().padStart(2, '0'); // getMonth() 返回 0-11
479
- const day = date.getDate().toString().padStart(2, '0');
480
-
481
- return `${year}-${month}-${day}`;
482
-
483
- // 示例使用
484
- // console.log(getRelativeDate('2023-03-04', 2)); // 返回 '2023-03-06'
485
- // console.log(getRelativeDate('2023-03-04', -2)); // 返回 '2023-03-02'
486
- }
487
-
488
-
489
- /**
490
- * 校验指定键名的值是否为指定值(默认为空字符串)
491
- * @param {Object} model 校验对象
492
- * @param {Array} fields 校验对象内的键名数组
493
- * @param {Any} valueToCheck 校验的值
494
- */
495
- function validateFields(model, fields, valueToCheck = "") {
496
- for (let field of fields) {
497
- if (model[field] === valueToCheck) {
498
- return true;
499
- }
500
- }
501
- return false;
502
- }
503
-
504
- /**
505
- * 本函数与Object.assign()的区别为不会像第一个对象中添加第一个对象原本不存在的键
506
- * 将第二个对象中相同键名的值赋值给第一个对象中相同键名
507
- * @param {Object} obj1
508
- * @param {Object} obj2
509
- */
510
- function mergeObjects(obj1, obj2) {
511
- // 遍历 obj1 的键名
512
- for (const key in obj1) {
513
- // 如果 obj2 中存在相同的键名
514
- if (obj2.hasOwnProperty(key)) {
515
- // 将 obj2 中的值赋值给 obj1 中的相同键名
516
- obj1[key] = obj2[key];
517
- }
518
- }
519
- return obj1;
520
- }
521
-
522
-
523
- export default {
524
- fmtNum,
525
- splitName,
526
- preciseSum,
527
- modifyKeys,
528
- sliceArray,
529
- findDataByData,
530
- splitArray,
531
- getProxyType,
532
- debounce,
533
- matchKeyValueInArray,
534
- urlEncode,
535
- compareDates,
536
- getDaysBetween,
537
- chineseNumeral,
538
- getMonthDate,
539
- getToday,
540
- resetObject,
541
- preciseOperation,
542
- getRelativeDate,
543
- validateFields,
544
- mergeObjects
545
- }