@yh-kit/utils 1.3.1 → 1.5.0

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/utils.js CHANGED
@@ -1,72 +1,125 @@
1
- const i = (t) => {
1
+ const b = (t) => {
2
2
  if (!t || !t.length) return {};
3
3
  const e = {};
4
4
  return t.forEach((r) => {
5
- const n = Object.assign({ label: r.label, text: r.label }, r);
6
- e[r == null ? void 0 : r.value] = n;
5
+ const o = Object.assign({ label: r.label, text: r.label }, r);
6
+ e[r == null ? void 0 : r.value] = o;
7
7
  }), e;
8
- }, u = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
8
+ }, y = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
9
9
  __proto__: null,
10
- toEnumObj: i
11
- }, Symbol.toStringTag, { value: "Module" })), h = {
12
- ...u,
13
- /**
14
- * 数组去重
15
- * @param arr 数组
16
- * @returns 去重后的数组
17
- */
18
- unique: (t) => t ? Array.from(new Set(t)) : [],
19
- /**
20
- * 判断某元素是否在数组中
21
- * @param arr 数组
22
- * @param element 查询元素
23
- * @returns 是否存在。true 存在;false 不存在
24
- */
25
- isExist(t, e) {
26
- return !t || !e ? !1 : t.indexOf(e) !== -1;
27
- },
28
- /**
29
- * 统计数组中某元素出现的次数:对于大型数组,手动循环的性能略优于 filter 和 reduce。
30
- * @param arr 数组
31
- * @param target 目标元素
32
- * @returns 出现次数
33
- */
34
- countOfAppear(t, e) {
35
- let r = 0;
36
- for (const n of t)
37
- n === e && r++;
38
- return r;
10
+ toEnumObj: b
11
+ }, Symbol.toStringTag, { value: "Module" })), A = Object.assign(
12
+ {
13
+ /**
14
+ * 数组去重
15
+ * @param arr 数组
16
+ * @returns 去重后的数组
17
+ */
18
+ unique(t) {
19
+ return t ? Array.from(new Set(t)) : [];
20
+ },
21
+ /**
22
+ * 判断某元素是否在数组中
23
+ * @param arr 数组
24
+ * @param element 查询元素
25
+ * @returns 是否存在。true 存在;false 不存在
26
+ */
27
+ isExist(t, e) {
28
+ return !t || !e ? !1 : t.indexOf(e) !== -1;
29
+ },
30
+ /**
31
+ * 统计数组中某元素出现的次数:对于大型数组,手动循环的性能略优于 filter 和 reduce。
32
+ * @param arr 数组
33
+ * @param target 目标元素
34
+ * @returns 出现次数
35
+ */
36
+ countOfAppear(t, e) {
37
+ let r = 0;
38
+ for (const o of t)
39
+ o === e && r++;
40
+ return r;
41
+ },
42
+ /**
43
+ * 数组排序-默认升序
44
+ * @param arr 数组
45
+ * @param order 排序方式:asc 升序;desc 降序
46
+ * @returns 排序后的数组
47
+ */
48
+ sort(t, e = "asc") {
49
+ return t ? t.sort((r, o) => e === "asc" ? r > o ? 1 : -1 : r < o ? 1 : -1) : [];
50
+ },
51
+ /**
52
+ * 数组乱序(洗牌算法)
53
+ * 1. 从数组的最后一个元素开始,将其与随机位置的元素交换位置。
54
+ * 2. 然后,从倒数第二个元素开始,将其与随机位置的元素交换位置。
55
+ * 3. 以此类推,直到第一个元素。
56
+ * 4. 这样,数组中的元素就会被随机打乱顺序。
57
+ * 5. 注意,这个算法会改变原数组。如果不想改变原数组,可以先复制一份再进行操作。
58
+ * 6. 时间复杂度:O(n)
59
+ * @param arr 数组
60
+ * @returns
61
+ */
62
+ shuffle(t) {
63
+ if (!t)
64
+ return [];
65
+ for (let e = t.length - 1; e > 0; e--) {
66
+ const r = Math.floor(Math.random() * (e + 1));
67
+ [t[e], t[r]] = [t[r], t[e]];
68
+ }
69
+ return t;
70
+ }
39
71
  },
40
- /**
41
- * 数组排序-默认升序
42
- * @param arr 数组
43
- * @param order 排序方式:asc 升序;desc 降序
44
- * @returns 排序后的数组
45
- */
46
- sort(t, e = "asc") {
47
- return t ? t.sort((r, n) => e === "asc" ? r > n ? 1 : -1 : r < n ? 1 : -1) : [];
72
+ {
73
+ ...y
74
+ }
75
+ ), j = {
76
+ /**
77
+ * 将Base64编码的字符串转换为Blob对象。
78
+ * Blob对象用于表示二进制大型对象,可以在浏览器环境中处理大文件或二进制数据。
79
+ *
80
+ * @param base64 Base64编码的字符串。
81
+ * @param contentType 可选参数,表示生成的Blob对象的MIME类型,默认为空字符串。
82
+ * @param sliceSize 可选参数,表示分片大小,默认为512字节。用于控制每次处理的Base64字符串长度,以优化大文件的处理。
83
+ * @returns 返回转换后的Blob对象,如果转换失败,则返回null。
84
+ */
85
+ toBlob(t, e = "", r = 512) {
86
+ const s = (t.split(",")[1] || t).replace(/-/g, "+").replace(/_/g, "/"), l = "=".repeat((4 - s.length % 4) % 4), d = s + l;
87
+ try {
88
+ const i = atob(d), g = [];
89
+ for (let u = 0; u < i.length; u += r) {
90
+ const n = i.slice(u, u + r), a = new Array(n.length);
91
+ for (let c = 0; c < n.length; c++)
92
+ a[c] = n.charCodeAt(c);
93
+ const f = new Uint8Array(a);
94
+ g.push(f);
95
+ }
96
+ return new Blob(g, { type: e });
97
+ } catch (i) {
98
+ return console.error("Failed to convert base64 to blob:", i), null;
99
+ }
48
100
  },
49
101
  /**
50
- * 数组乱序(洗牌算法)
51
- * 1. 从数组的最后一个元素开始,将其与随机位置的元素交换位置。
52
- * 2. 然后,从倒数第二个元素开始,将其与随机位置的元素交换位置。
53
- * 3. 以此类推,直到第一个元素。
54
- * 4. 这样,数组中的元素就会被随机打乱顺序。
55
- * 5. 注意,这个算法会改变原数组。如果不想改变原数组,可以先复制一份再进行操作。
56
- * 6. 时间复杂度:O(n)
57
- * @param arr 数组
58
- * @returns
59
- */
60
- shuffle(t) {
61
- if (!t)
62
- return [];
63
- for (let e = t.length - 1; e > 0; e--) {
64
- const r = Math.floor(Math.random() * (e + 1));
65
- [t[e], t[r]] = [t[r], t[e]];
102
+ * 将Base64编码的字符串转换为File对象。
103
+ * 这个函数接受一个Base64编码的字符串,一个可选的文件名和一个可选的MIME类型,
104
+ * 并返回一个代表原始数据的File对象。
105
+ *
106
+ * @param base64 Base64编码的字符串。
107
+ * @param fileName 文件名,默认为"file.txt"。
108
+ * @param mimeType MIME类型,默认为"text/plain"。
109
+ * @returns 返回一个File对象,包含解码后的数据。
110
+ */
111
+ toFile(t, e = "file.txt", r = "text/plain") {
112
+ const s = t.replace(/^data:.+;base64,/, "").replace(/-/g, "+").replace(/_/g, "/"), l = "=".repeat((4 - s.length % 4) % 4), d = s + l, i = atob(d), g = [];
113
+ for (let n = 0; n < i.length; n += 512) {
114
+ const a = i.slice(n, n + 512), f = new Array(a.length);
115
+ for (let c = 0; c < a.length; c++)
116
+ f[c] = a.charCodeAt(c);
117
+ g.push(new Uint8Array(f));
66
118
  }
67
- return t;
119
+ const u = new Blob(g, { type: r });
120
+ return new File([u], e, { type: r });
68
121
  }
69
- }, y = {
122
+ }, x = {
70
123
  /**
71
124
  * 检查是否为空字符串
72
125
  * @param str 要检查的字符串
@@ -210,7 +263,7 @@ const i = (t) => {
210
263
  isMobile() {
211
264
  return /Mobi|Android|iPhone/i.test(navigator.userAgent);
212
265
  }
213
- }, m = {
266
+ }, C = {
214
267
  /**
215
268
  * 通过传入的name获取cookie的值
216
269
  * @param name cookie的name
@@ -229,8 +282,8 @@ const i = (t) => {
229
282
  * @returns void
230
283
  */
231
284
  setCookie(t, e, r = 7) {
232
- const n = /* @__PURE__ */ new Date();
233
- n.setTime(n.getTime() + r * 24 * 60 * 60 * 1e3), document.cookie = `${t}=${encodeURIComponent(e)};expires=${n.toUTCString()};path=/`;
285
+ const o = /* @__PURE__ */ new Date();
286
+ o.setTime(o.getTime() + r * 24 * 60 * 60 * 1e3), document.cookie = `${t}=${encodeURIComponent(e)};expires=${o.toUTCString()};path=/`;
234
287
  },
235
288
  /**
236
289
  * 删除cookie
@@ -240,7 +293,7 @@ const i = (t) => {
240
293
  deleteCookie(t) {
241
294
  this.setCookie(t, "", -1);
242
295
  }
243
- }, b = {
296
+ }, _ = {
244
297
  /**
245
298
  * 获取当前时间字符串
246
299
  * @param locales 区域设置。如:'zh-CN','en-US',"chinese"。默认'zh-CN'。
@@ -257,8 +310,8 @@ const i = (t) => {
257
310
  * @returns 相差天数
258
311
  */
259
312
  diffDays(t, e) {
260
- const r = new Date(t).getTime(), n = new Date(e).getTime();
261
- return r > n ? Math.abs(Math.floor((r - n) / (24 * 3600 * 1e3))) : Math.abs(Math.floor((n - r) / (24 * 3600 * 1e3)));
313
+ const r = new Date(t).getTime(), o = new Date(e).getTime();
314
+ return r > o ? Math.abs(Math.floor((r - o) / (24 * 3600 * 1e3))) : Math.abs(Math.floor((o - r) / (24 * 3600 * 1e3)));
262
315
  },
263
316
  /**
264
317
  * 生成唯一ID(时间戳+随机数)
@@ -267,25 +320,112 @@ const i = (t) => {
267
320
  uniqueId() {
268
321
  return Date.now().toString(36) + Math.random().toString(36).substr(2, 5);
269
322
  }
270
- }, S = {
323
+ }, N = {
324
+ /**
325
+ * 将blob对象转化成文件并导出到本地
326
+ * @param blob blob对象
327
+ * @param filename 文件名
328
+ */
329
+ saveAsBlob(t, e) {
330
+ const r = document.createElement("a"), o = window.URL.createObjectURL(t);
331
+ r.href = o, r.download = e, document.body.appendChild(r), r.click(), URL.revokeObjectURL(o), document.body.removeChild(r);
332
+ }
333
+ }, B = {
334
+ /**
335
+ * 获取元素相对于文档顶部的偏移量(距离)
336
+ * 处理了SVG元素的特殊情况。
337
+ * @param el 元素
338
+ * @returns 偏移量(距离值)
339
+ */
340
+ getOffsetTop(t) {
341
+ if (!t)
342
+ throw new Error("Element is not provided");
343
+ if (t instanceof SVGElement) {
344
+ const r = t.getBoundingClientRect(), o = window.pageYOffset || document.documentElement.scrollTop;
345
+ return r.top + o;
346
+ }
347
+ let e = 0;
348
+ for (; t; )
349
+ e += t.offsetTop, t = t.offsetParent;
350
+ return e;
351
+ }
352
+ }, I = {
271
353
  /**
272
354
  * 将选中的字母数组从A-Z排序:用于试题选择答案的排序实例
273
355
  * @param arr 字母数组
274
356
  * @returns
275
357
  */
276
- sortFromA2Z: (t) => t != null && t.length ? t.sort((r, n) => {
277
- const o = r.toUpperCase(), s = n.toUpperCase();
278
- return o < s ? -1 : o > s ? 1 : 0;
279
- }) : void 0
280
- }, c = (t) => t > 25 || t < 0 ? "" : "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[t], l = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
358
+ sortFromA2Z(t) {
359
+ return t != null && t.length ? t.sort((r, o) => {
360
+ const s = r.toUpperCase(), l = o.toUpperCase();
361
+ return s < l ? -1 : s > l ? 1 : 0;
362
+ }) : void 0;
363
+ }
364
+ };
365
+ class L {
366
+ /**
367
+ * 转换为标准金额格式(带千分位和两位小数)
368
+ * @param num 要转换的数字
369
+ * @returns 格式化后的字符串
370
+ */
371
+ static toStandardFormat(e) {
372
+ try {
373
+ const r = typeof e == "string" ? parseFloat(e) : e;
374
+ if (isNaN(r))
375
+ throw new Error("输入不是有效的数字");
376
+ if (!isFinite(r))
377
+ throw new Error("输入是无穷大");
378
+ return r.toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
379
+ } catch (r) {
380
+ return console.error("格式化失败:", r), "格式错误";
381
+ }
382
+ }
383
+ /**
384
+ * 转换为中文大写金额
385
+ * @param num 要转换的数字
386
+ * @returns 中文大写金额字符串
387
+ */
388
+ static toChineseFormat(e) {
389
+ try {
390
+ const r = typeof e == "string" ? parseFloat(e) : e;
391
+ if (isNaN(r))
392
+ throw new Error("输入不是有效的数字");
393
+ if (r > 9999999999999e-2 || r < -9999999999999e-2)
394
+ throw new Error("输入数字超出范围");
395
+ const o = r < 0, s = Math.abs(r), l = Math.floor(s), d = Math.round((s - l) * 100), i = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"], g = ["", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟"], u = ["角", "分"];
396
+ let n = "", a = l;
397
+ if (a === 0)
398
+ n = i[0];
399
+ else {
400
+ let h = 0;
401
+ for (; a > 0; ) {
402
+ const p = a % 10;
403
+ p !== 0 ? n = i[p] + g[h] + n : n.charAt(0) !== i[0] && (n = i[p] + n), a = Math.floor(a / 10), h++;
404
+ }
405
+ n = n.replace(/零+/g, "零"), n = n.replace(/零+$/, "");
406
+ }
407
+ let f = "";
408
+ if (d > 0) {
409
+ const h = Math.floor(d / 10), p = d % 10;
410
+ h > 0 && (f += i[h] + u[0]), p > 0 && (f += i[p] + u[1]);
411
+ } else
412
+ f = "整";
413
+ let c = (o ? "负" : "") + n + "圆" + f;
414
+ return c === "零圆整" && (c = "零圆"), c;
415
+ } catch (r) {
416
+ return console.error("转换失败:", r), "格式错误";
417
+ }
418
+ }
419
+ }
420
+ const m = (t) => t > 25 || t < 0 ? "" : "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[t], w = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
281
421
  __proto__: null,
282
- toLetter: c
283
- }, Symbol.toStringTag, { value: "Module" })), a = (t) => t.toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","), f = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
422
+ toLetter: m
423
+ }, Symbol.toStringTag, { value: "Module" })), S = (t) => t.toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","), O = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
284
424
  __proto__: null,
285
- toMoney: a
286
- }, Symbol.toStringTag, { value: "Module" })), O = {
287
- ...l,
288
- ...f,
425
+ toMoney: S
426
+ }, Symbol.toStringTag, { value: "Module" })), T = {
427
+ ...w,
428
+ ...O,
289
429
  /**
290
430
  * 判断是否为数字
291
431
  * @param val 待判断的值
@@ -294,26 +434,32 @@ const i = (t) => {
294
434
  isNumber(t) {
295
435
  return typeof t == "number" && !isNaN(t);
296
436
  }
297
- }, w = {
437
+ }, v = {
298
438
  /**
299
439
  * 判断对象是否为空
300
440
  * @param obj 对象
301
441
  * @returns 是否为空。true 为空;false 不为空
302
442
  */
303
- isEmptyObject: (t) => t ? Object.keys(t).length === 0 && t.constructor === Object : !0
304
- }, U = {
443
+ isEmptyObject(t) {
444
+ return t ? Object.keys(t).length === 0 && t.constructor === Object : !0;
445
+ }
446
+ }, F = {
305
447
  /**
306
448
  * 脱敏
307
449
  * @param phone 电话号码/手机号码
308
450
  * @returns 脱敏后的电话号码/手机号码
309
451
  */
310
- desensitize: (t) => t ? t.replace(/^(\d{3})\d{4}(\d{4})$/, "$1****$2") || t.slice(0, 3) + "****" + t.slice(7) : ""
311
- }, M = {
452
+ desensitize(t) {
453
+ return t ? t.replace(/^(\d{3})\d{4}(\d{4})$/, "$1****$2") || t.slice(0, 3) + "****" + t.slice(7) : "";
454
+ }
455
+ }, P = {
312
456
  /**
313
457
  * 生成随机颜色
314
458
  * @returns 随机颜色值
315
459
  */
316
- color: () => `#${Math.random().toString(16).slice(2, 8)}`,
460
+ color: function() {
461
+ return `#${Math.random().toString(16).slice(2, 8)}`;
462
+ },
317
463
  /**
318
464
  * 生成指定范围的随机整数
319
465
  * @param min 最小值
@@ -330,7 +476,7 @@ const i = (t) => {
330
476
  uniqueId() {
331
477
  return Date.now().toString(36) + Math.random().toString(36).substr(2, 5);
332
478
  }
333
- }, _ = {
479
+ }, k = {
334
480
  /**
335
481
  * 通过key值获取 localStorage 中存储的某个值
336
482
  * @param key 获取的key
@@ -377,7 +523,7 @@ const i = (t) => {
377
523
  removeSession(t) {
378
524
  sessionStorage.removeItem(t);
379
525
  }
380
- }, j = {
526
+ }, R = {
381
527
  /**
382
528
  * 判断某元素是否在字符串中-比includes()方法更兼容,includes为ES6新增方法,IE不支持。小程序也不支持
383
529
  * @param str 字符串
@@ -411,57 +557,68 @@ const i = (t) => {
411
557
  return !1;
412
558
  }
413
559
  }
414
- }, g = (t) => {
560
+ }, U = (t) => {
415
561
  const r = new RegExp("[?&]" + t + "=([^&#]*)", "i").exec(window.location.href);
416
562
  return r ? decodeURIComponent(r[1]) : null;
417
563
  };
418
- function d(t) {
564
+ function M(t) {
419
565
  return new URLSearchParams(window.location.search).get(t);
420
566
  }
421
- const p = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
567
+ const E = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
422
568
  __proto__: null,
423
- getQueryInfoByName: g,
424
- getQueryParam: d
425
- }, Symbol.toStringTag, { value: "Module" })), E = {
426
- ...p,
569
+ getQueryInfoByName: U,
570
+ getQueryParam: M
571
+ }, Symbol.toStringTag, { value: "Module" })), $ = {
572
+ ...E,
427
573
  /**
428
574
  * 获取当前域名
429
575
  * @returns 当前url链接的host信息
430
576
  */
431
577
  getHost() {
432
578
  return window.location.host;
579
+ },
580
+ /**
581
+ * 获取当前页面路径
582
+ * @returns 当前url链接的pathname信息
583
+ */
584
+ getPath() {
585
+ return window.location.pathname;
433
586
  }
434
- }, I = {
587
+ }, D = {
435
588
  /**
436
589
  * 处理瀑布流数据,使其适合瀑布流布局展示
437
590
  * @param list 瀑布流数据-数组
438
591
  * @param columnsNum 需要展示的列数
439
592
  * @returns 适合瀑布流布局的数组
440
593
  */
441
- toList: (t, e = 2) => {
594
+ toList(t, e = 2) {
442
595
  console.log(t, e);
443
596
  const r = {};
444
- for (let o = 0; o < e; o++)
445
- r[o] = [];
446
- t.forEach((o, s) => r[s % e].push(o));
447
- const n = [];
448
- for (const o in r)
449
- n.push(...r[o]);
450
- return n;
597
+ for (let s = 0; s < e; s++)
598
+ r[s] = [];
599
+ t.forEach((s, l) => r[l % e].push(s));
600
+ const o = [];
601
+ for (const s in r)
602
+ o.push(...r[s]);
603
+ return o;
451
604
  }
452
605
  };
453
606
  export {
454
- h as arrayUtils,
455
- y as booleanUtils,
456
- m as cookieUtils,
457
- b as dateUtils,
458
- S as letterUtils,
459
- O as numberUtils,
460
- w as objectUtils,
461
- U as phoneUtils,
462
- M as randomUtils,
463
- _ as storageUtils,
464
- j as stringUtils,
465
- E as urlUtils,
466
- I as waterfallUtils
607
+ L as MoneyFormatter,
608
+ A as arrayUtils,
609
+ j as base64Utils,
610
+ x as booleanUtils,
611
+ C as cookieUtils,
612
+ _ as dateUtils,
613
+ N as downloadUtils,
614
+ B as elementUtils,
615
+ I as letterUtils,
616
+ T as numberUtils,
617
+ v as objectUtils,
618
+ F as phoneUtils,
619
+ P as randomUtils,
620
+ k as storageUtils,
621
+ R as stringUtils,
622
+ $ as urlUtils,
623
+ D as waterfallUtils
467
624
  };
@@ -1 +1 @@
1
- (function(o,s){typeof exports=="object"&&typeof module<"u"?s(exports):typeof define=="function"&&define.amd?define(["exports"],s):(o=typeof globalThis<"u"?globalThis:o||self,s(o.yhkitUtils={}))})(this,function(o){"use strict";const l={...Object.freeze(Object.defineProperty({__proto__:null,toEnumObj:t=>{if(!t||!t.length)return{};const e={};return t.forEach(r=>{const n=Object.assign({label:r.label,text:r.label},r);e[r==null?void 0:r.value]=n}),e}},Symbol.toStringTag,{value:"Module"})),unique:t=>t?Array.from(new Set(t)):[],isExist(t,e){return!t||!e?!1:t.indexOf(e)!==-1},countOfAppear(t,e){let r=0;for(const n of t)n===e&&r++;return r},sort(t,e="asc"){return t?t.sort((r,n)=>e==="asc"?r>n?1:-1:r<n?1:-1):[]},shuffle(t){if(!t)return[];for(let e=t.length-1;e>0;e--){const r=Math.floor(Math.random()*(e+1));[t[e],t[r]]=[t[r],t[e]]}return t}},c={isEmptyString(t){return typeof t=="string"&&t.trim()===""},isNumber(t){return typeof t=="number"&&!isNaN(t)},isObject(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)},isEmptyObject(t){return t?Object.keys(t).length===0&&t.constructor===Object:!0},isBoolean(t){return typeof t=="boolean"},isArray(t){return Array.isArray(t)},isFunction(t){return typeof t=="function"},isPromise(t){return!!t&&(typeof t=="object"||typeof t=="function")&&typeof t.then=="function"},isElement(t){return t instanceof Element},isPhone(t){return/^1[3-9]\d{9}$/.test(t)},isEmail(t){return/^[\w.-]+@[\w.-]+\.\w+$/.test(t)},isJSON(t){try{return JSON.parse(t),!0}catch{return!1}},isImageLoaded(t){return t.complete&&t.naturalWidth!==0},isInViewport(t){const e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom<=window.innerHeight&&e.right<=window.innerWidth},isLeapYear(t){return t%4===0&&t%100!==0||t%400===0},isMobile(){return/Mobi|Android|iPhone/i.test(navigator.userAgent)}},a={getCookie(t){if(!t)return;const e=document.cookie.match(new RegExp("(^| )"+t+"=([^;]+)"));return e?decodeURIComponent(e[2]):null},setCookie(t,e,r=7){const n=new Date;n.setTime(n.getTime()+r*24*60*60*1e3),document.cookie=`${t}=${encodeURIComponent(e)};expires=${n.toUTCString()};path=/`},deleteCookie(t){this.setCookie(t,"",-1)}},f={getTimeString(t,e=!1){return e?new Date().toLocaleString(t,{hour12:!0}):new Date().toLocaleString("chinese",{hour12:!1})},diffDays(t,e){const r=new Date(t).getTime(),n=new Date(e).getTime();return r>n?Math.abs(Math.floor((r-n)/(24*3600*1e3))):Math.abs(Math.floor((n-r)/(24*3600*1e3)))},uniqueId(){return Date.now().toString(36)+Math.random().toString(36).substr(2,5)}},d={sortFromA2Z:t=>t!=null&&t.length?t.sort((r,n)=>{const i=r.toUpperCase(),u=n.toUpperCase();return i<u?-1:i>u?1:0}):void 0},g={...Object.freeze(Object.defineProperty({__proto__:null,toLetter:t=>t>25||t<0?"":"ABCDEFGHIJKLMNOPQRSTUVWXYZ"[t]},Symbol.toStringTag,{value:"Module"})),...Object.freeze(Object.defineProperty({__proto__:null,toMoney:t=>t.toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g,",")},Symbol.toStringTag,{value:"Module"})),isNumber(t){return typeof t=="number"&&!isNaN(t)}},y={isEmptyObject:t=>t?Object.keys(t).length===0&&t.constructor===Object:!0},m={desensitize:t=>t?t.replace(/^(\d{3})\d{4}(\d{4})$/,"$1****$2")||t.slice(0,3)+"****"+t.slice(7):""},b={color:()=>`#${Math.random().toString(16).slice(2,8)}`,int(t,e){return Math.floor(Math.random()*(e-t+1))+t},uniqueId(){return Date.now().toString(36)+Math.random().toString(36).substr(2,5)}},h={getLocal(t){return localStorage.getItem(t)},setLocal(t,e){localStorage.setItem(t,e)},removeLocal(t){localStorage.removeItem(t)},getSession(t){return sessionStorage.getItem(t)},setSession(t,e){sessionStorage.setItem(t,e)},removeSession(t){sessionStorage.removeItem(t)}},p={isExist(t,e){if(!t||!e)return!1;const r=t.split(",");return console.log("判断某元素是否在字符串中",r.indexOf(e)===-1),r.indexOf(e)!==-1},includes(t,e){return!t||!e?!1:t.includes(e)},isJSON(t){try{return JSON.parse(t),!0}catch{return!1}}},S=t=>{const r=new RegExp("[?&]"+t+"=([^&#]*)","i").exec(window.location.href);return r?decodeURIComponent(r[1]):null};function U(t){return new URLSearchParams(window.location.search).get(t)}const O={...Object.freeze(Object.defineProperty({__proto__:null,getQueryInfoByName:S,getQueryParam:U},Symbol.toStringTag,{value:"Module"})),getHost(){return window.location.host}},w={toList:(t,e=2)=>{console.log(t,e);const r={};for(let i=0;i<e;i++)r[i]=[];t.forEach((i,u)=>r[u%e].push(i));const n=[];for(const i in r)n.push(...r[i]);return n}};o.arrayUtils=l,o.booleanUtils=c,o.cookieUtils=a,o.dateUtils=f,o.letterUtils=d,o.numberUtils=g,o.objectUtils=y,o.phoneUtils=m,o.randomUtils=b,o.storageUtils=h,o.stringUtils=p,o.urlUtils=O,o.waterfallUtils=w,Object.defineProperty(o,Symbol.toStringTag,{value:"Module"})});
1
+ (function(o,p){typeof exports=="object"&&typeof module<"u"?p(exports):typeof define=="function"&&define.amd?define(["exports"],p):(o=typeof globalThis<"u"?globalThis:o||self,p(o.yhkitUtils={}))})(this,function(o){"use strict";const m=Object.assign({unique(t){return t?Array.from(new Set(t)):[]},isExist(t,e){return!t||!e?!1:t.indexOf(e)!==-1},countOfAppear(t,e){let r=0;for(const n of t)n===e&&r++;return r},sort(t,e="asc"){return t?t.sort((r,n)=>e==="asc"?r>n?1:-1:r<n?1:-1):[]},shuffle(t){if(!t)return[];for(let e=t.length-1;e>0;e--){const r=Math.floor(Math.random()*(e+1));[t[e],t[r]]=[t[r],t[e]]}return t}},{...Object.freeze(Object.defineProperty({__proto__:null,toEnumObj:t=>{if(!t||!t.length)return{};const e={};return t.forEach(r=>{const n=Object.assign({label:r.label,text:r.label},r);e[r==null?void 0:r.value]=n}),e}},Symbol.toStringTag,{value:"Module"}))}),w={toBlob(t,e="",r=512){const i=(t.split(",")[1]||t).replace(/-/g,"+").replace(/_/g,"/"),u="=".repeat((4-i.length%4)%4),g=i+u;try{const c=atob(g),h=[];for(let f=0;f<c.length;f+=r){const s=c.slice(f,f+r),a=new Array(s.length);for(let l=0;l<s.length;l++)a[l]=s.charCodeAt(l);const d=new Uint8Array(a);h.push(d)}return new Blob(h,{type:e})}catch(c){return console.error("Failed to convert base64 to blob:",c),null}},toFile(t,e="file.txt",r="text/plain"){const i=t.replace(/^data:.+;base64,/,"").replace(/-/g,"+").replace(/_/g,"/"),u="=".repeat((4-i.length%4)%4),g=i+u,c=atob(g),h=[];for(let s=0;s<c.length;s+=512){const a=c.slice(s,s+512),d=new Array(a.length);for(let l=0;l<a.length;l++)d[l]=a.charCodeAt(l);h.push(new Uint8Array(d))}const f=new Blob(h,{type:r});return new File([f],e,{type:r})}},U={isEmptyString(t){return typeof t=="string"&&t.trim()===""},isNumber(t){return typeof t=="number"&&!isNaN(t)},isObject(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)},isEmptyObject(t){return t?Object.keys(t).length===0&&t.constructor===Object:!0},isBoolean(t){return typeof t=="boolean"},isArray(t){return Array.isArray(t)},isFunction(t){return typeof t=="function"},isPromise(t){return!!t&&(typeof t=="object"||typeof t=="function")&&typeof t.then=="function"},isElement(t){return t instanceof Element},isPhone(t){return/^1[3-9]\d{9}$/.test(t)},isEmail(t){return/^[\w.-]+@[\w.-]+\.\w+$/.test(t)},isJSON(t){try{return JSON.parse(t),!0}catch{return!1}},isImageLoaded(t){return t.complete&&t.naturalWidth!==0},isInViewport(t){const e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom<=window.innerHeight&&e.right<=window.innerWidth},isLeapYear(t){return t%4===0&&t%100!==0||t%400===0},isMobile(){return/Mobi|Android|iPhone/i.test(navigator.userAgent)}},S={getCookie(t){if(!t)return;const e=document.cookie.match(new RegExp("(^| )"+t+"=([^;]+)"));return e?decodeURIComponent(e[2]):null},setCookie(t,e,r=7){const n=new Date;n.setTime(n.getTime()+r*24*60*60*1e3),document.cookie=`${t}=${encodeURIComponent(e)};expires=${n.toUTCString()};path=/`},deleteCookie(t){this.setCookie(t,"",-1)}},O={getTimeString(t,e=!1){return e?new Date().toLocaleString(t,{hour12:!0}):new Date().toLocaleString("chinese",{hour12:!1})},diffDays(t,e){const r=new Date(t).getTime(),n=new Date(e).getTime();return r>n?Math.abs(Math.floor((r-n)/(24*3600*1e3))):Math.abs(Math.floor((n-r)/(24*3600*1e3)))},uniqueId(){return Date.now().toString(36)+Math.random().toString(36).substr(2,5)}},M={saveAsBlob(t,e){const r=document.createElement("a"),n=window.URL.createObjectURL(t);r.href=n,r.download=e,document.body.appendChild(r),r.click(),URL.revokeObjectURL(n),document.body.removeChild(r)}},j={getOffsetTop(t){if(!t)throw new Error("Element is not provided");if(t instanceof SVGElement){const r=t.getBoundingClientRect(),n=window.pageYOffset||document.documentElement.scrollTop;return r.top+n}let e=0;for(;t;)e+=t.offsetTop,t=t.offsetParent;return e}},E={sortFromA2Z(t){return t!=null&&t.length?t.sort((r,n)=>{const i=r.toUpperCase(),u=n.toUpperCase();return i<u?-1:i>u?1:0}):void 0}};class A{static toStandardFormat(e){try{const r=typeof e=="string"?parseFloat(e):e;if(isNaN(r))throw new Error("输入不是有效的数字");if(!isFinite(r))throw new Error("输入是无穷大");return r.toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g,",")}catch(r){return console.error("格式化失败:",r),"格式错误"}}static toChineseFormat(e){try{const r=typeof e=="string"?parseFloat(e):e;if(isNaN(r))throw new Error("输入不是有效的数字");if(r>9999999999999e-2||r<-9999999999999e-2)throw new Error("输入数字超出范围");const n=r<0,i=Math.abs(r),u=Math.floor(i),g=Math.round((i-u)*100),c=["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"],h=["","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟"],f=["角","分"];let s="",a=u;if(a===0)s=c[0];else{let y=0;for(;a>0;){const b=a%10;b!==0?s=c[b]+h[y]+s:s.charAt(0)!==c[0]&&(s=c[b]+s),a=Math.floor(a/10),y++}s=s.replace(/零+/g,"零"),s=s.replace(/零+$/,"")}let d="";if(g>0){const y=Math.floor(g/10),b=g%10;y>0&&(d+=c[y]+f[0]),b>0&&(d+=c[b]+f[1])}else d="整";let l=(n?"负":"")+s+"圆"+d;return l==="零圆整"&&(l="零圆"),l}catch(r){return console.error("转换失败:",r),"格式错误"}}}const C={...Object.freeze(Object.defineProperty({__proto__:null,toLetter:t=>t>25||t<0?"":"ABCDEFGHIJKLMNOPQRSTUVWXYZ"[t]},Symbol.toStringTag,{value:"Module"})),...Object.freeze(Object.defineProperty({__proto__:null,toMoney:t=>t.toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g,",")},Symbol.toStringTag,{value:"Module"})),isNumber(t){return typeof t=="number"&&!isNaN(t)}},_={isEmptyObject(t){return t?Object.keys(t).length===0&&t.constructor===Object:!0}},N={desensitize(t){return t?t.replace(/^(\d{3})\d{4}(\d{4})$/,"$1****$2")||t.slice(0,3)+"****"+t.slice(7):""}},T={color:function(){return`#${Math.random().toString(16).slice(2,8)}`},int(t,e){return Math.floor(Math.random()*(e-t+1))+t},uniqueId(){return Date.now().toString(36)+Math.random().toString(36).substr(2,5)}},B={getLocal(t){return localStorage.getItem(t)},setLocal(t,e){localStorage.setItem(t,e)},removeLocal(t){localStorage.removeItem(t)},getSession(t){return sessionStorage.getItem(t)},setSession(t,e){sessionStorage.setItem(t,e)},removeSession(t){sessionStorage.removeItem(t)}},I={isExist(t,e){if(!t||!e)return!1;const r=t.split(",");return console.log("判断某元素是否在字符串中",r.indexOf(e)===-1),r.indexOf(e)!==-1},includes(t,e){return!t||!e?!1:t.includes(e)},isJSON(t){try{return JSON.parse(t),!0}catch{return!1}}},L=t=>{const r=new RegExp("[?&]"+t+"=([^&#]*)","i").exec(window.location.href);return r?decodeURIComponent(r[1]):null};function k(t){return new URLSearchParams(window.location.search).get(t)}const v={...Object.freeze(Object.defineProperty({__proto__:null,getQueryInfoByName:L,getQueryParam:k},Symbol.toStringTag,{value:"Module"})),getHost(){return window.location.host},getPath(){return window.location.pathname}},F={toList(t,e=2){console.log(t,e);const r={};for(let i=0;i<e;i++)r[i]=[];t.forEach((i,u)=>r[u%e].push(i));const n=[];for(const i in r)n.push(...r[i]);return n}};o.MoneyFormatter=A,o.arrayUtils=m,o.base64Utils=w,o.booleanUtils=U,o.cookieUtils=S,o.dateUtils=O,o.downloadUtils=M,o.elementUtils=j,o.letterUtils=E,o.numberUtils=C,o.objectUtils=_,o.phoneUtils=N,o.randomUtils=T,o.storageUtils=B,o.stringUtils=I,o.urlUtils=v,o.waterfallUtils=F,Object.defineProperty(o,Symbol.toStringTag,{value:"Module"})});
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@yh-kit/utils",
3
3
  "private": false,
4
- "version": "1.3.1",
4
+ "version": "1.5.0",
5
5
  "type": "module",
6
6
  "files": [
7
7
  "dist",
@@ -35,4 +35,4 @@
35
35
  "access": "public",
36
36
  "registry": "https://registry.npmjs.org/"
37
37
  }
38
- }
38
+ }
@@ -7,7 +7,7 @@ export declare const arrayUtils: {
7
7
  * @param arr 数组
8
8
  * @returns 去重后的数组
9
9
  */
10
- unique: <T>(arr: T[]) => T[];
10
+ unique<T>(arr: T[]): T[];
11
11
  /**
12
12
  * 判断某元素是否在数组中
13
13
  * @param arr 数组
@@ -41,5 +41,6 @@ export declare const arrayUtils: {
41
41
  * @returns
42
42
  */
43
43
  shuffle<T>(arr: T[]): T[];
44
- toEnumObj: (arr: import("../../../typings/src").IOptionItem[]) => import("../../../typings/src").TValueEnum;
44
+ } & {
45
+ toEnumObj: (arr: import("@yh-kit/types").IOptionItem[]) => import("@yh-kit/types").TValueEnum;
45
46
  };
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Base64 相关操作工具函数
3
+ */
4
+ export declare const base64Utils: {
5
+ /**
6
+ * 将Base64编码的字符串转换为Blob对象。
7
+ * Blob对象用于表示二进制大型对象,可以在浏览器环境中处理大文件或二进制数据。
8
+ *
9
+ * @param base64 Base64编码的字符串。
10
+ * @param contentType 可选参数,表示生成的Blob对象的MIME类型,默认为空字符串。
11
+ * @param sliceSize 可选参数,表示分片大小,默认为512字节。用于控制每次处理的Base64字符串长度,以优化大文件的处理。
12
+ * @returns 返回转换后的Blob对象,如果转换失败,则返回null。
13
+ */
14
+ toBlob(base64: string, contentType?: string, sliceSize?: number): Blob | null;
15
+ /**
16
+ * 将Base64编码的字符串转换为File对象。
17
+ * 这个函数接受一个Base64编码的字符串,一个可选的文件名和一个可选的MIME类型,
18
+ * 并返回一个代表原始数据的File对象。
19
+ *
20
+ * @param base64 Base64编码的字符串。
21
+ * @param fileName 文件名,默认为"file.txt"。
22
+ * @param mimeType MIME类型,默认为"text/plain"。
23
+ * @returns 返回一个File对象,包含解码后的数据。
24
+ */
25
+ toFile(base64: string, fileName?: string, mimeType?: string): File;
26
+ };
@@ -0,0 +1,11 @@
1
+ /**
2
+ * 下载相关工具函数
3
+ */
4
+ export declare const downloadUtils: {
5
+ /**
6
+ * 将blob对象转化成文件并导出到本地
7
+ * @param blob blob对象
8
+ * @param filename 文件名
9
+ */
10
+ saveAsBlob(blob: Blob | MediaSource, filename: string): void;
11
+ };
@@ -0,0 +1,12 @@
1
+ /**
2
+ * 元素相关工具函数
3
+ */
4
+ export declare const elementUtils: {
5
+ /**
6
+ * 获取元素相对于文档顶部的偏移量(距离)
7
+ * 处理了SVG元素的特殊情况。
8
+ * @param el 元素
9
+ * @returns 偏移量(距离值)
10
+ */
11
+ getOffsetTop(el: HTMLElement): number;
12
+ };
@@ -1,8 +1,12 @@
1
1
  export * from "./array";
2
+ export * from "./base64";
2
3
  export * from "./boolean";
3
4
  export * from "./cookie";
4
5
  export * from "./date";
6
+ export * from "./download";
7
+ export * from "./element";
5
8
  export * from "./letter";
9
+ export * from "./money";
6
10
  export * from "./number";
7
11
  export * from "./object";
8
12
  export * from "./phone";
@@ -7,5 +7,5 @@ export declare const letterUtils: {
7
7
  * @param arr 字母数组
8
8
  * @returns
9
9
  */
10
- sortFromA2Z: (arr: string[]) => string[] | undefined;
10
+ sortFromA2Z(arr: string[]): string[] | undefined;
11
11
  };
@@ -0,0 +1,17 @@
1
+ /**
2
+ * 金额格式化工具类
3
+ */
4
+ export declare class MoneyFormatter {
5
+ /**
6
+ * 转换为标准金额格式(带千分位和两位小数)
7
+ * @param num 要转换的数字
8
+ * @returns 格式化后的字符串
9
+ */
10
+ static toStandardFormat(num: number | string): string;
11
+ /**
12
+ * 转换为中文大写金额
13
+ * @param num 要转换的数字
14
+ * @returns 中文大写金额字符串
15
+ */
16
+ static toChineseFormat(num: number | string): string;
17
+ }
@@ -7,5 +7,5 @@ export declare const objectUtils: {
7
7
  * @param obj 对象
8
8
  * @returns 是否为空。true 为空;false 不为空
9
9
  */
10
- isEmptyObject: (obj: object) => boolean;
10
+ isEmptyObject(obj: object): boolean;
11
11
  };
@@ -7,5 +7,5 @@ export declare const phoneUtils: {
7
7
  * @param phone 电话号码/手机号码
8
8
  * @returns 脱敏后的电话号码/手机号码
9
9
  */
10
- desensitize: (phone: string) => string;
10
+ desensitize(phone: string): string;
11
11
  };
@@ -7,6 +7,11 @@ export declare const urlUtils: {
7
7
  * @returns 当前url链接的host信息
8
8
  */
9
9
  getHost(): string;
10
+ /**
11
+ * 获取当前页面路径
12
+ * @returns 当前url链接的pathname信息
13
+ */
14
+ getPath(): string;
10
15
  getQueryParam(name: string): string | null;
11
16
  getQueryInfoByName: (name: string) => string | null;
12
17
  };
@@ -8,5 +8,5 @@ export declare const waterfallUtils: {
8
8
  * @param columnsNum 需要展示的列数
9
9
  * @returns 适合瀑布流布局的数组
10
10
  */
11
- toList: <T>(list: T[], columnsNum?: number) => any[];
11
+ toList<T>(list: T[], columnsNum?: number): any[];
12
12
  };