@yh-kit/utils 1.16.0 → 1.17.1
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/README.md +24 -23
- package/dist/utils.js +245 -125
- package/dist/utils.umd.cjs +1 -1
- package/package.json +1 -1
- package/types/array/fisher-yates.d.ts +19 -1
- package/types/array/index.d.ts +2 -0
- package/types/common/clone.d.ts +29 -0
- package/types/common/index.d.ts +4 -6
- package/types/common/type.d.ts +9 -0
package/README.md
CHANGED
|
@@ -12,29 +12,30 @@
|
|
|
12
12
|
|
|
13
13
|
此库包含以下工具函数,及其函数名如下:
|
|
14
14
|
|
|
15
|
-
| 函数对象名 | 描述 | 函数实现方式 |
|
|
16
|
-
| :------ | :------ | :------ |
|
|
17
|
-
| arrayUtils | 数组相关操作工具函数 | js对象函数 |
|
|
18
|
-
| Base64Utils | Base64 相关操作工具函数 | class类 |
|
|
19
|
-
| booleanUtils | 布尔值相关操作工具函数 | js对象函数 |
|
|
20
|
-
|
|
|
21
|
-
|
|
|
22
|
-
|
|
|
23
|
-
|
|
|
24
|
-
|
|
|
25
|
-
|
|
|
26
|
-
|
|
|
27
|
-
|
|
|
28
|
-
|
|
|
29
|
-
|
|
|
30
|
-
|
|
|
31
|
-
|
|
|
32
|
-
|
|
|
33
|
-
|
|
|
34
|
-
|
|
|
35
|
-
|
|
|
36
|
-
|
|
|
37
|
-
|
|
|
15
|
+
| 函数对象名 | 描述 | 函数实现方式 | 备注 |
|
|
16
|
+
| :------ | :------ | :------ | :------ |
|
|
17
|
+
| arrayUtils | 数组相关操作工具函数 | js对象函数 | 文档地址:[arrayUtils](./lib/common/README.MD) |
|
|
18
|
+
| Base64Utils | Base64 相关操作工具函数 | class类 | 文档地址:[Base64Utils](./lib/common/README.MD) |
|
|
19
|
+
| booleanUtils | 布尔值相关操作工具函数 | js对象函数 | 文档地址:[booleanUtils](./lib/common/README.MD) |
|
|
20
|
+
| commonUtils | 公用工具函数 | js对象函数 | 文档地址:[commonUtils](./lib/common/README.MD) |
|
|
21
|
+
| cookieUtils | Cookie 相关操作工具函数 | js对象函数 | 文档地址:[cookieUtils](./lib/common/README.MD) |
|
|
22
|
+
| dateUtils | 日期相关操作工具函数 | js对象函数 | 文档地址:[dateUtils](./lib/common/README.MD) |
|
|
23
|
+
| documentUtils | 文档相关操作工具函数 | js对象函数 | 文档地址:[documentUtils](./lib/common/README.MD) |
|
|
24
|
+
| downloadUtils | 下载相关操作工具函数 | js对象函数 | 文档地址:[downloadUtils](./lib/common/README.MD) |
|
|
25
|
+
| echartsUtils | Echarts 相关操作工具函数 | js对象函数 | 文档地址:[echartsUtils](./lib/common/README.MD) |
|
|
26
|
+
| letterUtils | 字母相关操作工具函数 | js对象函数 | 文档地址:[letterUtils](./lib/common/README.MD) |
|
|
27
|
+
| mapUtils | 地图相关操作工具函数 | js对象函数 | 文档地址:[mapUtils](./lib/common/README.MD) |
|
|
28
|
+
| MoneyFormatter | 金额格式化工具函数 | class类 | 文档地址:[MoneyFormatter](./lib/common/README.MD) |
|
|
29
|
+
| nameUtils | 姓名相关操作工具函数 | namespace | 文档地址:[nameUtils](./lib/common/README.MD) |
|
|
30
|
+
| numberUtils | 数字相关操作工具函数 | js对象函数 | 文档地址:[numberUtils](./lib/common/README.MD) |
|
|
31
|
+
| objectUtils | 对象相关操作工具函数 | js对象函数 | 文档地址:[objectUtils](./lib/common/README.MD) |
|
|
32
|
+
| phoneUtils | 手机号相关操作工具函数 | js对象函数 | 文档地址:[phoneUtils](./lib/common/README.MD) |
|
|
33
|
+
| randomUtils | 随机数相关操作工具函数 | js对象函数 | 文档地址:[randomUtils](./lib/common/README.MD) |
|
|
34
|
+
| regexpUtils | 常用正则表达式 | js对象函数 | 文档地址:[regexpUtils](./lib/common/README.MD) |
|
|
35
|
+
| storageUtils | 本地存储相关操作工具函数 | js对象函数 | 文档地址:[storageUtils](./lib/common/README.MD) |
|
|
36
|
+
| stringUtils | 字符串相关操作工具函数 | js对象函数 | 文档地址:[stringUtils](./lib/common/README.MD) |
|
|
37
|
+
| urlUtils | URL 相关操作工具函数 | js对象函数 | 文档地址:[urlUtils](./lib/common/README.MD) |
|
|
38
|
+
| waterfallUtils | 瀑布流相关操作工具函数 | js对象函数 | 文档地址:[waterfallUtils](./lib/common/README.MD) |
|
|
38
39
|
|
|
39
40
|
## 使用
|
|
40
41
|
|
package/dist/utils.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const
|
|
1
|
+
const b = {
|
|
2
2
|
/**
|
|
3
3
|
* 统计数组中某元素出现的次数:对于大型数组,手动循环的性能略优于 filter 和 reduce。
|
|
4
4
|
* @param arr 数组
|
|
@@ -41,7 +41,7 @@ const m = {
|
|
|
41
41
|
t[r[n]] = o;
|
|
42
42
|
}), t;
|
|
43
43
|
}
|
|
44
|
-
},
|
|
44
|
+
}, M = {
|
|
45
45
|
/**
|
|
46
46
|
* 判断某元素是否在存在于数组中(indexOf方法)
|
|
47
47
|
* @param arr 数组
|
|
@@ -107,9 +107,13 @@ const m = {
|
|
|
107
107
|
{ value: e[0], index: 0 }
|
|
108
108
|
);
|
|
109
109
|
}
|
|
110
|
-
},
|
|
110
|
+
}, E = {
|
|
111
111
|
/**
|
|
112
112
|
* 数组随机打乱-Fisher-Yates算法
|
|
113
|
+
* 要点:
|
|
114
|
+
* 1、倒叙遍历数组;
|
|
115
|
+
* 2、获取随机位置,并交换当前位置和随机位置的元素;
|
|
116
|
+
* 3、返回洗牌后的数组;
|
|
113
117
|
* @param arr 数组
|
|
114
118
|
* @returns 随机打乱后的数组
|
|
115
119
|
*
|
|
@@ -128,7 +132,7 @@ const m = {
|
|
|
128
132
|
return n;
|
|
129
133
|
},
|
|
130
134
|
/**
|
|
131
|
-
* 数组随机抽样-Fisher-Yates算法前k次迭代,再取前k
|
|
135
|
+
* 数组随机抽样-Fisher-Yates算法前k次迭代,再取前k个元素【洗牌开头,返回开头(更常见)】
|
|
132
136
|
* @param arr 数组
|
|
133
137
|
* @param k 抽样次数
|
|
134
138
|
* @returns 抽样后的数组
|
|
@@ -140,12 +144,48 @@ const m = {
|
|
|
140
144
|
throw new Error("抽样次数必须在1次到数组长度之间");
|
|
141
145
|
const t = [...e];
|
|
142
146
|
for (let r = 0; r < n; r++) {
|
|
143
|
-
const o = Math.floor(Math.random() * (e.length - r));
|
|
147
|
+
const o = Math.floor(Math.random() * (e.length - r)) + r;
|
|
148
|
+
[t[r], t[o]] = [t[o], t[r]];
|
|
149
|
+
}
|
|
150
|
+
return t.slice(0, n);
|
|
151
|
+
},
|
|
152
|
+
/**
|
|
153
|
+
* 数组随机抽样-Fisher-Yates算法【洗牌开头,返回开头(更常见)】
|
|
154
|
+
* @param arr 数组
|
|
155
|
+
* @param k 抽样次数
|
|
156
|
+
* @returns 抽样后的数组
|
|
157
|
+
*/
|
|
158
|
+
sampleByStart(e, n) {
|
|
159
|
+
if (!e)
|
|
160
|
+
return [];
|
|
161
|
+
if (n <= 0 || n > e.length)
|
|
162
|
+
throw new Error("抽样次数必须在1次到数组长度之间");
|
|
163
|
+
const t = [...e];
|
|
164
|
+
for (let r = n - 1; r >= 0; r--) {
|
|
165
|
+
const o = Math.floor(Math.random() * (e.length - r)) + r;
|
|
144
166
|
[t[r], t[o]] = [t[o], t[r]];
|
|
145
167
|
}
|
|
146
168
|
return t.slice(0, n);
|
|
169
|
+
},
|
|
170
|
+
/**
|
|
171
|
+
* 数组随机抽样-Fisher-Yates算法【洗牌结尾,返回结尾(不常见)】
|
|
172
|
+
* @param arr 数组
|
|
173
|
+
* @param k 抽样次数
|
|
174
|
+
* @returns 抽样后的数组
|
|
175
|
+
*/
|
|
176
|
+
sampleByEnd(e, n) {
|
|
177
|
+
if (!e)
|
|
178
|
+
return [];
|
|
179
|
+
if (n <= 0 || n > e.length)
|
|
180
|
+
throw new Error("抽样次数必须在1次到数组长度之间");
|
|
181
|
+
const t = [...e];
|
|
182
|
+
for (let r = e.length - 1; r >= e.length - n; r--) {
|
|
183
|
+
const o = Math.floor(Math.random() * (r + 1));
|
|
184
|
+
[t[r], t[o]] = [t[o], t[r]];
|
|
185
|
+
}
|
|
186
|
+
return t.slice(e.length - n);
|
|
147
187
|
}
|
|
148
|
-
},
|
|
188
|
+
}, x = {
|
|
149
189
|
/**
|
|
150
190
|
* 数组排序-默认升序
|
|
151
191
|
* @param arr 数组
|
|
@@ -155,7 +195,7 @@ const m = {
|
|
|
155
195
|
sort(e, n = "asc") {
|
|
156
196
|
return e ? e.sort((t, r) => n === "asc" ? t > r ? 1 : -1 : t < r ? 1 : -1) : [];
|
|
157
197
|
}
|
|
158
|
-
},
|
|
198
|
+
}, B = {
|
|
159
199
|
/**
|
|
160
200
|
* 数组去重:针对简单类型数据s
|
|
161
201
|
* 性能 O(n)
|
|
@@ -280,23 +320,23 @@ const m = {
|
|
|
280
320
|
if (r)
|
|
281
321
|
return o.filter((s, c, l) => c === l.findIndex((i) => r(s, i)));
|
|
282
322
|
}
|
|
283
|
-
},
|
|
323
|
+
}, C = {
|
|
284
324
|
// 数组转对象
|
|
285
325
|
...A,
|
|
286
326
|
// 数组去重
|
|
287
|
-
...
|
|
327
|
+
...B,
|
|
288
328
|
// 判断元素是否存在
|
|
289
|
-
...
|
|
329
|
+
...M,
|
|
290
330
|
// 数组排序
|
|
291
|
-
...
|
|
331
|
+
...x,
|
|
292
332
|
// 获取极值
|
|
293
333
|
...S,
|
|
294
334
|
// 统计出现次数
|
|
295
|
-
...
|
|
335
|
+
...b,
|
|
296
336
|
// 数组随机打乱-Fisher-Yates算法
|
|
297
|
-
...
|
|
337
|
+
...E
|
|
298
338
|
};
|
|
299
|
-
class
|
|
339
|
+
class N {
|
|
300
340
|
/** Base64 编码表 */
|
|
301
341
|
static BASE64_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
302
342
|
/**
|
|
@@ -313,10 +353,10 @@ class k {
|
|
|
313
353
|
try {
|
|
314
354
|
const i = atob(l), h = [];
|
|
315
355
|
for (let a = 0; a < i.length; a += r) {
|
|
316
|
-
const u = i.slice(a, a + r),
|
|
317
|
-
for (let
|
|
318
|
-
d
|
|
319
|
-
const p = new Uint8Array(
|
|
356
|
+
const u = i.slice(a, a + r), f = new Array(u.length);
|
|
357
|
+
for (let d = 0; d < u.length; d++)
|
|
358
|
+
f[d] = u.charCodeAt(d);
|
|
359
|
+
const p = new Uint8Array(f);
|
|
320
360
|
h.push(p);
|
|
321
361
|
}
|
|
322
362
|
return new Blob(h, { type: t });
|
|
@@ -337,9 +377,9 @@ class k {
|
|
|
337
377
|
static toFile(n, t = "file.txt", r = "text/plain") {
|
|
338
378
|
const s = n.replace(/^data:.+;base64,/, "").replace(/-/g, "+").replace(/_/g, "/"), c = "=".repeat((4 - s.length % 4) % 4), l = s + c, i = atob(l), h = [];
|
|
339
379
|
for (let u = 0; u < i.length; u += 512) {
|
|
340
|
-
const
|
|
341
|
-
for (let
|
|
342
|
-
p[
|
|
380
|
+
const f = i.slice(u, u + 512), p = new Array(f.length);
|
|
381
|
+
for (let d = 0; d < f.length; d++)
|
|
382
|
+
p[d] = f.charCodeAt(d);
|
|
343
383
|
h.push(new Uint8Array(p));
|
|
344
384
|
}
|
|
345
385
|
const a = new Blob(h, { type: r });
|
|
@@ -418,8 +458,8 @@ class k {
|
|
|
418
458
|
static _bytesToBase64(n) {
|
|
419
459
|
let t = "", r = 0;
|
|
420
460
|
for (; r < n.length; ) {
|
|
421
|
-
const o = n[r++], s = r < n.length, c = s ? n[r++] : 0, l = r < n.length, i = l ? n[r++] : 0, h = o >> 2, a = (o & 3) << 4 | c >> 4, u = (c & 15) << 2 | i >> 6,
|
|
422
|
-
s ? l ? t += this.BASE64_CHARS.charAt(h) + this.BASE64_CHARS.charAt(a) + this.BASE64_CHARS.charAt(u) + this.BASE64_CHARS.charAt(
|
|
461
|
+
const o = n[r++], s = r < n.length, c = s ? n[r++] : 0, l = r < n.length, i = l ? n[r++] : 0, h = o >> 2, a = (o & 3) << 4 | c >> 4, u = (c & 15) << 2 | i >> 6, f = i & 63;
|
|
462
|
+
s ? l ? t += this.BASE64_CHARS.charAt(h) + this.BASE64_CHARS.charAt(a) + this.BASE64_CHARS.charAt(u) + this.BASE64_CHARS.charAt(f) : t += this.BASE64_CHARS.charAt(h) + this.BASE64_CHARS.charAt(a) + this.BASE64_CHARS.charAt(u) + "=" : t += this.BASE64_CHARS.charAt(h) + this.BASE64_CHARS.charAt(a) + "==";
|
|
423
463
|
}
|
|
424
464
|
return t;
|
|
425
465
|
}
|
|
@@ -435,14 +475,14 @@ class k {
|
|
|
435
475
|
c[this.BASE64_CHARS.charCodeAt(h)] = h;
|
|
436
476
|
let l = 0, i = 0;
|
|
437
477
|
for (; i < t; ) {
|
|
438
|
-
const h = c[n.charCodeAt(i++)], a = c[n.charCodeAt(i++)], u = i < t ? c[n.charCodeAt(i++)] : -1,
|
|
478
|
+
const h = c[n.charCodeAt(i++)], a = c[n.charCodeAt(i++)], u = i < t ? c[n.charCodeAt(i++)] : -1, f = i < t ? c[n.charCodeAt(i++)] : -1;
|
|
439
479
|
if (h === -1 || a === -1)
|
|
440
480
|
throw new Error("无效的 Base64 字符");
|
|
441
481
|
const p = h << 2 | a >> 4;
|
|
442
482
|
if (s[l++] = p, u !== -1) {
|
|
443
|
-
const
|
|
444
|
-
if (s[l++] =
|
|
445
|
-
const g = (u & 3) << 6 |
|
|
483
|
+
const d = (a & 15) << 4 | u >> 2;
|
|
484
|
+
if (s[l++] = d, f !== -1) {
|
|
485
|
+
const g = (u & 3) << 6 | f;
|
|
446
486
|
s[l++] = g;
|
|
447
487
|
}
|
|
448
488
|
}
|
|
@@ -450,7 +490,7 @@ class k {
|
|
|
450
490
|
return s;
|
|
451
491
|
}
|
|
452
492
|
}
|
|
453
|
-
const
|
|
493
|
+
const R = {
|
|
454
494
|
/**
|
|
455
495
|
* 检查是否为空字符串
|
|
456
496
|
* @param str 要检查的字符串
|
|
@@ -594,7 +634,115 @@ const C = {
|
|
|
594
634
|
isMobile() {
|
|
595
635
|
return /Mobi|Android|iPhone/i.test(navigator.userAgent);
|
|
596
636
|
}
|
|
597
|
-
},
|
|
637
|
+
}, m = {
|
|
638
|
+
/**
|
|
639
|
+
* 判断对象是否为空
|
|
640
|
+
* @param obj 对象
|
|
641
|
+
* @returns 是否为空。true 为空;false 不为空
|
|
642
|
+
*/
|
|
643
|
+
isEmptyObject(e) {
|
|
644
|
+
return e ? Object.keys(e).length === 0 && e.constructor === Object : !0;
|
|
645
|
+
},
|
|
646
|
+
/**
|
|
647
|
+
* 复制对象【对象的浅拷贝 把obj1的成员,复制给obj2】
|
|
648
|
+
* @param obj1 源对象
|
|
649
|
+
* @param obj2 目标对象
|
|
650
|
+
*/
|
|
651
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
652
|
+
copy(e, n) {
|
|
653
|
+
for (const t in e)
|
|
654
|
+
n[t] = e[t];
|
|
655
|
+
},
|
|
656
|
+
/**
|
|
657
|
+
* 对象的深拷贝 把o1 的成员,复制给o2
|
|
658
|
+
* @param o1
|
|
659
|
+
* @param o2
|
|
660
|
+
*/
|
|
661
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
662
|
+
deepCopy(e, n) {
|
|
663
|
+
for (const t in e) {
|
|
664
|
+
const r = e[t];
|
|
665
|
+
r instanceof Object ? (n[t] = {}, this.deepCopy(r, n[t])) : r instanceof Array ? (n[t] = [], this.deepCopy(r, n[t])) : n[t] = e[t];
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
}, D = {
|
|
669
|
+
/**
|
|
670
|
+
* 浅拷贝
|
|
671
|
+
* @param source 需要处理的源对象
|
|
672
|
+
* @returns 浅拷贝后的新对象
|
|
673
|
+
*/
|
|
674
|
+
shallowClone(e) {
|
|
675
|
+
if (e === null || typeof e != "object")
|
|
676
|
+
return e;
|
|
677
|
+
if (m.isEmptyObject(e))
|
|
678
|
+
return {};
|
|
679
|
+
const n = {};
|
|
680
|
+
for (const t in e)
|
|
681
|
+
n[t] = e[t];
|
|
682
|
+
return n;
|
|
683
|
+
},
|
|
684
|
+
/**
|
|
685
|
+
* 最便捷实现深克隆/拷贝
|
|
686
|
+
* 存在的问题:
|
|
687
|
+
* (1)序列化会自动忽略 undefined、Symbol、函数等特殊类型
|
|
688
|
+
* (2)序列化会将 NaN、Infinity、-Infinity 转换为 null
|
|
689
|
+
* (3)无法解决循环引用的问题。报错:TypeError: Converting circular structure to JSON
|
|
690
|
+
* @param source 任意对象
|
|
691
|
+
* @returns 深克隆/拷贝后的对象
|
|
692
|
+
*/
|
|
693
|
+
deepCloneByJSON(e) {
|
|
694
|
+
return e === null || typeof e != "object" ? e : m.isEmptyObject(e) ? {} : JSON.parse(JSON.stringify(e));
|
|
695
|
+
},
|
|
696
|
+
/**
|
|
697
|
+
* 深拷贝函数
|
|
698
|
+
* (1)处理对象和数组
|
|
699
|
+
* (2)支持循环引用
|
|
700
|
+
* (3)还支持更多类型的对象,如 Date、RegExp、Error、Map、Set、Symbol、Function、Node 等
|
|
701
|
+
* @param source 任意对象
|
|
702
|
+
* @param map 用于存储已经拷贝过的对象,避免循环引用
|
|
703
|
+
* @returns 深拷贝/拷贝后的对象
|
|
704
|
+
*/
|
|
705
|
+
deepCloneByMap(e, n = /* @__PURE__ */ new WeakMap()) {
|
|
706
|
+
if (e === null || typeof e != "object")
|
|
707
|
+
return e;
|
|
708
|
+
if (m.isEmptyObject(e))
|
|
709
|
+
throw new Error("空对象不能进行深拷贝");
|
|
710
|
+
if (n.has(e))
|
|
711
|
+
return n.get(e);
|
|
712
|
+
const t = U.getType(e);
|
|
713
|
+
let r;
|
|
714
|
+
switch (t) {
|
|
715
|
+
case "object":
|
|
716
|
+
case "array":
|
|
717
|
+
r = Array.isArray(e) ? [] : {};
|
|
718
|
+
break;
|
|
719
|
+
case "Date":
|
|
720
|
+
r = new Date(e);
|
|
721
|
+
break;
|
|
722
|
+
case "RegExp":
|
|
723
|
+
r = new RegExp(e);
|
|
724
|
+
break;
|
|
725
|
+
case "Map":
|
|
726
|
+
r = new Map(e);
|
|
727
|
+
break;
|
|
728
|
+
case "Set":
|
|
729
|
+
r = new Set(e);
|
|
730
|
+
break;
|
|
731
|
+
default:
|
|
732
|
+
return e;
|
|
733
|
+
}
|
|
734
|
+
return n.set(e, r), t === "Map" ? (e.forEach((o, s) => {
|
|
735
|
+
r.set(this.deepCloneByMap(s, n), this.deepCloneByMap(o, n));
|
|
736
|
+
}), r) : t === "Set" ? (e.forEach((o) => {
|
|
737
|
+
r.add(this.deepCloneByMap(o, n));
|
|
738
|
+
}), r) : (Reflect.ownKeys(e).forEach((o) => {
|
|
739
|
+
r[o] = this.deepCloneByMap(
|
|
740
|
+
e[o],
|
|
741
|
+
n
|
|
742
|
+
);
|
|
743
|
+
}), r);
|
|
744
|
+
}
|
|
745
|
+
}, O = {
|
|
598
746
|
/**
|
|
599
747
|
* 获取变量的类型
|
|
600
748
|
* @param val 任意变量
|
|
@@ -603,7 +751,10 @@ const C = {
|
|
|
603
751
|
getType(e) {
|
|
604
752
|
return Object.prototype.toString.call(e).replace(/\[object\s(\w+)\]/, "$1");
|
|
605
753
|
}
|
|
606
|
-
},
|
|
754
|
+
}, U = {
|
|
755
|
+
...O,
|
|
756
|
+
...D
|
|
757
|
+
}, F = {
|
|
607
758
|
/**
|
|
608
759
|
* 通过传入的name获取cookie的值
|
|
609
760
|
* @param name cookie的name
|
|
@@ -633,7 +784,7 @@ const C = {
|
|
|
633
784
|
deleteCookie(e) {
|
|
634
785
|
this.setCookie(e, "", -1);
|
|
635
786
|
}
|
|
636
|
-
},
|
|
787
|
+
}, P = {
|
|
637
788
|
/**
|
|
638
789
|
* 获取当前时间字符串
|
|
639
790
|
* @param locales 区域设置。如:'zh-CN','en-US',"chinese"。默认'zh-CN'。
|
|
@@ -681,7 +832,7 @@ const C = {
|
|
|
681
832
|
r += 31;
|
|
682
833
|
break;
|
|
683
834
|
case 2:
|
|
684
|
-
|
|
835
|
+
R.isLeapYear(e) ? r += 29 : r += 28;
|
|
685
836
|
break;
|
|
686
837
|
default:
|
|
687
838
|
r += 30;
|
|
@@ -700,9 +851,9 @@ const C = {
|
|
|
700
851
|
let a = "";
|
|
701
852
|
const u = n ? " " + this.formatDate(r, "hh:mm") : "";
|
|
702
853
|
if (o === l) {
|
|
703
|
-
const
|
|
854
|
+
const d = t.getTime() - e;
|
|
704
855
|
if (s === i && c === h)
|
|
705
|
-
|
|
856
|
+
d < 60 * 1e3 ? a = "刚刚" : a = this.formatDate(r, "hh:mm");
|
|
706
857
|
else {
|
|
707
858
|
const g = /* @__PURE__ */ new Date();
|
|
708
859
|
g.setDate(g.getDate() - 1);
|
|
@@ -711,7 +862,7 @@ const C = {
|
|
|
711
862
|
a = "昨天" + u;
|
|
712
863
|
else if (i === w.getMonth() + 1 && h === w.getDate())
|
|
713
864
|
a = "前天" + u;
|
|
714
|
-
else if (
|
|
865
|
+
else if (d / 36e5 <= 7 * 24) {
|
|
715
866
|
const y = new Array(7);
|
|
716
867
|
y[0] = "星期日", y[1] = "星期一", y[2] = "星期二", y[3] = "星期三", y[4] = "星期四", y[5] = "星期五", y[6] = "星期六", a = y[r.getDay()] + u;
|
|
717
868
|
} else a = this.formatDate(r, "yyyy/M/d") + u;
|
|
@@ -748,7 +899,7 @@ const C = {
|
|
|
748
899
|
new RegExp("(" + r + ")").test(n) && (n = n.replace(RegExp.$1, RegExp.$1.length === 1 ? t[r] : ("00" + t[r]).substr(("" + t[r]).length)));
|
|
749
900
|
return n;
|
|
750
901
|
}
|
|
751
|
-
},
|
|
902
|
+
}, q = {
|
|
752
903
|
/**
|
|
753
904
|
* 获取元素相对于文档顶部的偏移量(距离)
|
|
754
905
|
* 处理了SVG元素的特殊情况。
|
|
@@ -819,7 +970,7 @@ const C = {
|
|
|
819
970
|
getViewportHeight() {
|
|
820
971
|
return window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
|
|
821
972
|
}
|
|
822
|
-
},
|
|
973
|
+
}, V = {
|
|
823
974
|
/**
|
|
824
975
|
* 将blob对象转化成文件并导出到本地
|
|
825
976
|
* @param blob blob对象
|
|
@@ -838,7 +989,7 @@ const C = {
|
|
|
838
989
|
const t = document.createElement("a");
|
|
839
990
|
t.href = e, t.download = n, document.body.appendChild(t), t.click(), URL.revokeObjectURL(e), document.body.removeChild(t);
|
|
840
991
|
}
|
|
841
|
-
},
|
|
992
|
+
}, W = {
|
|
842
993
|
/**
|
|
843
994
|
* echarts动画函数
|
|
844
995
|
* @param option echarts配置
|
|
@@ -870,7 +1021,7 @@ const C = {
|
|
|
870
1021
|
});
|
|
871
1022
|
});
|
|
872
1023
|
}
|
|
873
|
-
},
|
|
1024
|
+
}, Y = {
|
|
874
1025
|
/**
|
|
875
1026
|
* 将选中的字母数组从A-Z排序:用于试题选择答案的排序实例
|
|
876
1027
|
* @param arr 字母数组
|
|
@@ -882,7 +1033,7 @@ const C = {
|
|
|
882
1033
|
return o < s ? -1 : o > s ? 1 : 0;
|
|
883
1034
|
}) : void 0;
|
|
884
1035
|
}
|
|
885
|
-
},
|
|
1036
|
+
}, z = {
|
|
886
1037
|
/**
|
|
887
1038
|
* 角度(度数)转弧度
|
|
888
1039
|
* 在数学和编程里,角度有两种常用单位,分别是度(°)和弧度(rad)。
|
|
@@ -930,7 +1081,7 @@ const C = {
|
|
|
930
1081
|
const r = this, o = e.longitude ?? e.lng, s = e.latitude ?? e.lat, c = n.longitude ?? n.lng, l = n.latitude ?? n.lat;
|
|
931
1082
|
if (o === void 0 || s === void 0 || c === void 0 || l === void 0)
|
|
932
1083
|
throw new Error("无效的坐标格式,缺少经纬度信息");
|
|
933
|
-
const i = 6371, h = r.degrees2Radians(s), a = r.degrees2Radians(l), u = r.degrees2Radians(l - s),
|
|
1084
|
+
const i = 6371, h = r.degrees2Radians(s), a = r.degrees2Radians(l), u = r.degrees2Radians(l - s), f = r.degrees2Radians(c - o), p = Math.sin(u / 2) * Math.sin(u / 2) + Math.cos(h) * Math.cos(a) * Math.sin(f / 2) * Math.sin(f / 2), d = 2 * Math.atan2(Math.sqrt(p), Math.sqrt(1 - p)), g = i * d;
|
|
934
1085
|
switch (t) {
|
|
935
1086
|
case "m":
|
|
936
1087
|
return g * 1e3;
|
|
@@ -968,7 +1119,7 @@ const C = {
|
|
|
968
1119
|
return { segments: r, total: o };
|
|
969
1120
|
}
|
|
970
1121
|
};
|
|
971
|
-
class
|
|
1122
|
+
class J {
|
|
972
1123
|
/**
|
|
973
1124
|
* 转换为标准金额格式(带千分位和两位小数)
|
|
974
1125
|
* @param num 要转换的数字
|
|
@@ -1003,27 +1154,27 @@ class W {
|
|
|
1003
1154
|
if (u === 0)
|
|
1004
1155
|
a = l[0];
|
|
1005
1156
|
else {
|
|
1006
|
-
let
|
|
1157
|
+
let d = 0;
|
|
1007
1158
|
for (; u > 0; ) {
|
|
1008
1159
|
const g = u % 10;
|
|
1009
|
-
g !== 0 ? a = l[g] + i[
|
|
1160
|
+
g !== 0 ? a = l[g] + i[d] + a : a.charAt(0) !== l[0] && (a = l[g] + a), u = Math.floor(u / 10), d++;
|
|
1010
1161
|
}
|
|
1011
1162
|
a = a.replace(/零+/g, "零"), a = a.replace(/零+$/, "");
|
|
1012
1163
|
}
|
|
1013
|
-
let
|
|
1164
|
+
let f = "";
|
|
1014
1165
|
if (c > 0) {
|
|
1015
|
-
const
|
|
1016
|
-
|
|
1166
|
+
const d = Math.floor(c / 10), g = c % 10;
|
|
1167
|
+
d > 0 && (f += l[d] + h[0]), g > 0 && (f += l[g] + h[1]);
|
|
1017
1168
|
} else
|
|
1018
|
-
|
|
1019
|
-
let p = (r ? "负" : "") + a + "圆" +
|
|
1169
|
+
f = "整";
|
|
1170
|
+
let p = (r ? "负" : "") + a + "圆" + f;
|
|
1020
1171
|
return p === "零圆整" && (p = "零圆"), p;
|
|
1021
1172
|
} catch (t) {
|
|
1022
1173
|
return console.error("转换失败:", t), "格式错误";
|
|
1023
1174
|
}
|
|
1024
1175
|
}
|
|
1025
1176
|
}
|
|
1026
|
-
const
|
|
1177
|
+
const Z = {
|
|
1027
1178
|
/**
|
|
1028
1179
|
* 中文姓名脱敏
|
|
1029
1180
|
* @param name 姓名
|
|
@@ -1066,15 +1217,15 @@ const Y = {
|
|
|
1066
1217
|
}
|
|
1067
1218
|
return `${e.slice(0, c)}${"*".repeat(e.length - c)}`;
|
|
1068
1219
|
}
|
|
1069
|
-
},
|
|
1220
|
+
}, v = (e) => e > 25 || e < 0 ? "" : "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[e], T = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
1070
1221
|
__proto__: null,
|
|
1071
|
-
toLetter:
|
|
1072
|
-
}, Symbol.toStringTag, { value: "Module" })),
|
|
1222
|
+
toLetter: v
|
|
1223
|
+
}, Symbol.toStringTag, { value: "Module" })), j = (e) => e.toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","), L = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
1073
1224
|
__proto__: null,
|
|
1074
|
-
toMoney:
|
|
1075
|
-
}, Symbol.toStringTag, { value: "Module" })),
|
|
1076
|
-
...
|
|
1077
|
-
...
|
|
1225
|
+
toMoney: j
|
|
1226
|
+
}, Symbol.toStringTag, { value: "Module" })), K = {
|
|
1227
|
+
...T,
|
|
1228
|
+
...L,
|
|
1078
1229
|
/**
|
|
1079
1230
|
* 判断是否为数字
|
|
1080
1231
|
* @param val 待判断的值
|
|
@@ -1083,38 +1234,7 @@ const Y = {
|
|
|
1083
1234
|
isNumber(e) {
|
|
1084
1235
|
return typeof e == "number" && !isNaN(e);
|
|
1085
1236
|
}
|
|
1086
|
-
},
|
|
1087
|
-
/**
|
|
1088
|
-
* 判断对象是否为空
|
|
1089
|
-
* @param obj 对象
|
|
1090
|
-
* @returns 是否为空。true 为空;false 不为空
|
|
1091
|
-
*/
|
|
1092
|
-
isEmptyObject(e) {
|
|
1093
|
-
return !e || JSON.stringify(e) === "{}" ? !0 : Object.keys(e).length === 0 && e.constructor === Object;
|
|
1094
|
-
},
|
|
1095
|
-
/**
|
|
1096
|
-
* 复制对象【对象的浅拷贝 把obj1的成员,复制给obj2】
|
|
1097
|
-
* @param obj1 源对象
|
|
1098
|
-
* @param obj2 目标对象
|
|
1099
|
-
*/
|
|
1100
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1101
|
-
copy(e, n) {
|
|
1102
|
-
for (const t in e)
|
|
1103
|
-
n[t] = e[t];
|
|
1104
|
-
},
|
|
1105
|
-
/**
|
|
1106
|
-
* 对象的深拷贝 把o1 的成员,复制给o2
|
|
1107
|
-
* @param o1
|
|
1108
|
-
* @param o2
|
|
1109
|
-
*/
|
|
1110
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1111
|
-
deepCopy(e, n) {
|
|
1112
|
-
for (const t in e) {
|
|
1113
|
-
const r = e[t];
|
|
1114
|
-
r instanceof Object ? (n[t] = {}, this.deepCopy(r, n[t])) : r instanceof Array ? (n[t] = [], this.deepCopy(r, n[t])) : n[t] = e[t];
|
|
1115
|
-
}
|
|
1116
|
-
}
|
|
1117
|
-
}, J = {
|
|
1237
|
+
}, X = {
|
|
1118
1238
|
/**
|
|
1119
1239
|
* 脱敏
|
|
1120
1240
|
* @param phone 电话号码/手机号码
|
|
@@ -1123,7 +1243,7 @@ const Y = {
|
|
|
1123
1243
|
desensitize(e) {
|
|
1124
1244
|
return e ? e.replace(/^(\d{3})\d{4}(\d{4})$/, "$1****$2") || e.slice(0, 3) + "****" + e.slice(7) : "";
|
|
1125
1245
|
}
|
|
1126
|
-
},
|
|
1246
|
+
}, G = {
|
|
1127
1247
|
/**
|
|
1128
1248
|
* 生成随机颜色
|
|
1129
1249
|
* @returns 随机颜色值
|
|
@@ -1147,7 +1267,7 @@ const Y = {
|
|
|
1147
1267
|
uniqueId() {
|
|
1148
1268
|
return Date.now().toString(36) + Math.random().toString(36).substr(2, 5);
|
|
1149
1269
|
}
|
|
1150
|
-
},
|
|
1270
|
+
}, Q = {
|
|
1151
1271
|
/**
|
|
1152
1272
|
* 验证手机号
|
|
1153
1273
|
*/
|
|
@@ -1184,7 +1304,7 @@ const Y = {
|
|
|
1184
1304
|
* 验证0.01~0.99正则:最多两位小数。0.1、0.10、0.9、0.90
|
|
1185
1305
|
*/
|
|
1186
1306
|
decimal: /^0\.(0[1-9]|[1-9][0-9]*)$/
|
|
1187
|
-
},
|
|
1307
|
+
}, ee = {
|
|
1188
1308
|
/**
|
|
1189
1309
|
* 通过key值获取 localStorage 中存储的某个值
|
|
1190
1310
|
* @param key 获取的key
|
|
@@ -1231,7 +1351,7 @@ const Y = {
|
|
|
1231
1351
|
removeSession(e) {
|
|
1232
1352
|
sessionStorage.removeItem(e);
|
|
1233
1353
|
}
|
|
1234
|
-
},
|
|
1354
|
+
}, te = {
|
|
1235
1355
|
/**
|
|
1236
1356
|
* 判断某元素是否在字符串中-比includes()方法更兼容,includes为ES6新增方法,IE不支持。小程序也不支持
|
|
1237
1357
|
* @param str 字符串
|
|
@@ -1314,19 +1434,19 @@ const Y = {
|
|
|
1314
1434
|
throw new Error("开始位置小于0或结束位置超出字符串长度或开始位置大于结束位置");
|
|
1315
1435
|
return e.slice(0, n) + "*".repeat(t - n + 1) + e.slice(t);
|
|
1316
1436
|
}
|
|
1317
|
-
},
|
|
1437
|
+
}, I = (e) => {
|
|
1318
1438
|
const t = new RegExp("[?&]" + e + "=([^&#]*)", "gi").exec(window.location.href);
|
|
1319
1439
|
return t ? decodeURIComponent(t[1]) : null;
|
|
1320
1440
|
};
|
|
1321
|
-
function
|
|
1441
|
+
function _(e) {
|
|
1322
1442
|
return new URLSearchParams(window.location.search).get(e);
|
|
1323
1443
|
}
|
|
1324
|
-
const
|
|
1444
|
+
const H = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
1325
1445
|
__proto__: null,
|
|
1326
|
-
getQueryInfoByName:
|
|
1327
|
-
getQueryParam:
|
|
1328
|
-
}, Symbol.toStringTag, { value: "Module" })),
|
|
1329
|
-
...
|
|
1446
|
+
getQueryInfoByName: I,
|
|
1447
|
+
getQueryParam: _
|
|
1448
|
+
}, Symbol.toStringTag, { value: "Module" })), ne = {
|
|
1449
|
+
...H,
|
|
1330
1450
|
/**
|
|
1331
1451
|
* 获取当前域名
|
|
1332
1452
|
* @returns 当前url链接的host信息
|
|
@@ -1341,7 +1461,7 @@ const T = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
|
1341
1461
|
getPath() {
|
|
1342
1462
|
return window.location.pathname;
|
|
1343
1463
|
}
|
|
1344
|
-
},
|
|
1464
|
+
}, re = {
|
|
1345
1465
|
/**
|
|
1346
1466
|
* 处理瀑布流数据,使其竖向瀑布流布局呈现横向瀑布流的展现形式。适用于 column-gap: 20rpx; column-count: 2; 布局的瀑布流
|
|
1347
1467
|
* @param list 瀑布流数据-数组
|
|
@@ -1372,33 +1492,33 @@ const T = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
|
1372
1492
|
if (i < s)
|
|
1373
1493
|
a.style.left = (o + c) * i + "px", l[i] = a.offsetHeight;
|
|
1374
1494
|
else {
|
|
1375
|
-
const { index: u, value:
|
|
1376
|
-
a.style.left = (o + c) * u + "px", a.style.top =
|
|
1495
|
+
const { index: u, value: f } = C.getMinValueAndIndex(l);
|
|
1496
|
+
a.style.left = (o + c) * u + "px", a.style.top = f + t + "px", l[u] = a.offsetHeight + t + f;
|
|
1377
1497
|
}
|
|
1378
1498
|
}
|
|
1379
1499
|
}
|
|
1380
1500
|
};
|
|
1381
1501
|
export {
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1502
|
+
N as Base64Utils,
|
|
1503
|
+
J as MoneyFormatter,
|
|
1504
|
+
C as arrayUtils,
|
|
1505
|
+
R as booleanUtils,
|
|
1506
|
+
U as commonUtils,
|
|
1507
|
+
F as cookieUtils,
|
|
1508
|
+
P as dateUtils,
|
|
1509
|
+
q as documentUtils,
|
|
1510
|
+
V as downloadUtils,
|
|
1511
|
+
W as echartsUtils,
|
|
1512
|
+
Y as letterUtils,
|
|
1513
|
+
z as mapUtils,
|
|
1514
|
+
Z as nameUtils,
|
|
1515
|
+
K as numberUtils,
|
|
1516
|
+
m as objectUtils,
|
|
1517
|
+
X as phoneUtils,
|
|
1518
|
+
G as randomUtils,
|
|
1519
|
+
Q as regexpUtils,
|
|
1520
|
+
ee as storageUtils,
|
|
1521
|
+
te as stringUtils,
|
|
1522
|
+
ne as urlUtils,
|
|
1523
|
+
re as waterfallUtils
|
|
1404
1524
|
};
|
package/dist/utils.umd.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(d,w){typeof exports=="object"&&typeof module<"u"?w(exports):typeof define=="function"&&define.amd?define(["exports"],w):(d=typeof globalThis<"u"?globalThis:d||self,w(d.yhkitUtils={}))})(this,function(d){"use strict";const A={...{toEnumObj(e,n="value"){if(!e||!e.length)return{};const t={};return e.forEach(r=>{const o=Object.assign({label:r.label,text:r.label},r);t[r[n]]=o}),t}},...{uniqueBySet(e){if(!e)throw new Error("数组不能为空");const n=e;return Array.from(new Set(n))},uniqueByFilter(e){if(!e)throw new Error("数组不能为空");return e.filter((t,r,o)=>r===o.indexOf(t))},uniqueByReduce(e){if(!e)throw new Error("数组不能为空");return e.reduce((t,r)=>(t.includes(r)||t.push(r),t),[])},uniqueByIncludes(e){if(!e)throw new Error("数组不能为空");const n=e,t=[];return n.forEach(r=>{t.includes(r)||t.push(r)}),t},uniqueByFor(e){if(!e)throw new Error("数组不能为空");const n=e,t=[];for(let r=0;r<n.length;r++)t.includes(n[r])||t.push(n[r]);return t},uniqueByKey(e,n){if(!e||!n)throw new Error("数组不能为空或键名不能为空");const t=e,r=new Map;return t.filter(o=>r.has(o[n])?!1:(r.set(o[n],!0),!0))},unique(e,n={}){const{keys:t,compareFn:r}=n;if(!e)throw new Error("数组不能为空");const o=e;if(!t&&!r)return this.uniqueBySet(o);if(t){const s=new Map;return o.filter(c=>{const l=t.map(i=>c[i]).join("|");return s.has(l)?!1:(s.set(l,!0),!0)})}if(r)return o.filter((s,c,l)=>c===l.findIndex(i=>r(s,i)))}},...{isExistByIndexOf(e,n){return!e||!n?!1:e.indexOf(n)!==-1},isExistByIncludes(e,n){return!e||!n?!1:e.includes(n)}},...{sort(e,n="asc"){return e?e.sort((t,r)=>n==="asc"?t>r?1:-1:t<r?1:-1):[]}},...{getMaxValue(e){return e?Math.max(...e):0},getMinValue(e){return e?Math.min(...e):0},getMinValueAndIndex(e){if(e.length===0)return{value:0,index:0};const n={value:e[0],index:0};for(let t=1,r=e.length;t<r;t++){const o=e[t];n.value>o&&(n.value=o,n.index=t)}return n},getMaxValueAndIndex(e){return e.length===0?{value:0,index:0}:e.reduce((n,t,r)=>t<n.value?{value:t,index:r}:n,{value:e[0],index:0})}},...{countOfAppear(e,n){let t=0;for(const r of e)r===n&&t++;return t},indexsOfAppear(e,n){let t=-1;const r=[];do t=e.indexOf(n,t+1),t!==-1&&r.push(t);while(t!==-1);return r}},...{shuffle(e){if(!e)return[];const n=[...e];for(let t=n.length-1;t>0;t--){const r=Math.floor(Math.random()*(t+1));[n[t],n[r]]=[n[r],n[t]]}return n},sample(e,n){if(!e)return[];if(n<=0||n>e.length)throw new Error("抽样次数必须在1次到数组长度之间");const t=[...e];for(let r=0;r<n;r++){const o=Math.floor(Math.random()*(e.length-r));[t[r],t[o]]=[t[o],t[r]]}return t.slice(0,n)}}};class M{static BASE64_CHARS="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";static toBlob(n,t="",r=512){const s=(n.split(",")[1]||n).replace(/-/g,"+").replace(/_/g,"/"),c="=".repeat((4-s.length%4)%4),l=s+c;try{const i=atob(l),h=[];for(let a=0;a<i.length;a+=r){const u=i.slice(a,a+r),f=new Array(u.length);for(let g=0;g<u.length;g++)f[g]=u.charCodeAt(g);const y=new Uint8Array(f);h.push(y)}return new Blob(h,{type:t})}catch(i){return console.error("Failed to convert base64 to blob:",i),null}}static toFile(n,t="file.txt",r="text/plain"){const s=n.replace(/^data:.+;base64,/,"").replace(/-/g,"+").replace(/_/g,"/"),c="=".repeat((4-s.length%4)%4),l=s+c,i=atob(l),h=[];for(let u=0;u<i.length;u+=512){const f=i.slice(u,u+512),y=new Array(f.length);for(let g=0;g<f.length;g++)y[g]=f.charCodeAt(g);h.push(new Uint8Array(y))}const a=new Blob(h,{type:r});return new File([a],t,{type:r})}static encode(n){if(!n)return"";const t=this._stringToUtf8Bytes(n);return this._bytesToBase64(t)}static decode(n){if(!n)return"";n=n.replace(/\s/g,"");const t=this._base64ToBytes(n);return this._utf8BytesToString(t)}static _stringToUtf8Bytes(n){const t=[];for(let r=0;r<n.length;r++){let o=n.charCodeAt(r);if(o<128)t.push(o);else if(o<2048)t.push(192|o>>6),t.push(128|o&63);else if(o<55296||o>=57344)t.push(224|o>>12),t.push(128|o>>6&63),t.push(128|o&63);else{r++;const s=o,c=n.charCodeAt(r);if(isNaN(c))throw new Error("代理对不完整");o=65536+((s&1023)<<10)+(c&1023),t.push(240|o>>18),t.push(128|o>>12&63),t.push(128|o>>6&63),t.push(128|o&63)}}return t}static _utf8BytesToString(n){let t="",r=0;for(;r<n.length;){const o=n[r++];if(o<128)t+=String.fromCharCode(o);else if(o>=192&&o<224){const s=n[r++]&63;t+=String.fromCharCode((o&31)<<6|s)}else if(o>=224&&o<240){const s=n[r++]&63,c=n[r++]&63;t+=String.fromCharCode((o&15)<<12|s<<6|c)}else if(o>=240&&o<248){const s=n[r++]&63,c=n[r++]&63,l=n[r++]&63,i=(o&7)<<18|s<<12|c<<6|l,h=Math.floor((i-65536)/1024)+55296,a=(i-65536)%1024+56320;t+=String.fromCharCode(h,a)}else t+="�"}return t}static _bytesToBase64(n){let t="",r=0;for(;r<n.length;){const o=n[r++],s=r<n.length,c=s?n[r++]:0,l=r<n.length,i=l?n[r++]:0,h=o>>2,a=(o&3)<<4|c>>4,u=(c&15)<<2|i>>6,f=i&63;s?l?t+=this.BASE64_CHARS.charAt(h)+this.BASE64_CHARS.charAt(a)+this.BASE64_CHARS.charAt(u)+this.BASE64_CHARS.charAt(f):t+=this.BASE64_CHARS.charAt(h)+this.BASE64_CHARS.charAt(a)+this.BASE64_CHARS.charAt(u)+"=":t+=this.BASE64_CHARS.charAt(h)+this.BASE64_CHARS.charAt(a)+"=="}return t}static _base64ToBytes(n){const t=n.length;let r=0;t>=2&&(n[t-1]==="="&&r++,n[t-2]==="="&&r++);const o=Math.floor(t*3/4)-r,s=new Array(o),c=new Array(256).fill(-1);for(let h=0;h<this.BASE64_CHARS.length;h++)c[this.BASE64_CHARS.charCodeAt(h)]=h;let l=0,i=0;for(;i<t;){const h=c[n.charCodeAt(i++)],a=c[n.charCodeAt(i++)],u=i<t?c[n.charCodeAt(i++)]:-1,f=i<t?c[n.charCodeAt(i++)]:-1;if(h===-1||a===-1)throw new Error("无效的 Base64 字符");const y=h<<2|a>>4;if(s[l++]=y,u!==-1){const g=(a&15)<<4|u>>2;if(s[l++]=g,f!==-1){const p=(u&3)<<6|f;s[l++]=p}}}return s}}const S={isEmptyString(e){return typeof e=="string"&&e.trim()===""},isNumber(e){return typeof e=="number"&&!isNaN(e)},isObject(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)},isEmptyObject(e){return e?Object.keys(e).length===0&&e.constructor===Object:!0},isBoolean(e){return typeof e=="boolean"},isArray(e){return Array.isArray(e)},isFunction(e){return typeof e=="function"},isPromise(e){return!!e&&(typeof e=="object"||typeof e=="function")&&typeof e.then=="function"},isElement(e){return e instanceof Element},isPhone(e){return/^1[3-9]\d{9}$/.test(e)},isEmail(e){return/^[\w.-]+@[\w.-]+\.\w+$/.test(e)},isJSON(e){try{return JSON.parse(e),!0}catch{return!1}},isImageLoaded(e){return e.complete&&e.naturalWidth!==0},isInViewport(e){const n=e.getBoundingClientRect();return n.top>=0&&n.left>=0&&n.bottom<=window.innerHeight&&n.right<=window.innerWidth},isLeapYear(e){return e%4===0&&e%100!==0||e%400===0},isMobile(){return/Mobi|Android|iPhone/i.test(navigator.userAgent)}},E={getType(e){return Object.prototype.toString.call(e).replace(/\[object\s(\w+)\]/,"$1")}},U={getCookie(e){if(!e)return;const n=document.cookie.match(new RegExp("(^| )"+e+"=([^;]+)"));return n?decodeURIComponent(n[2]):null},setCookie(e,n,t=7){const r=new Date;r.setTime(r.getTime()+t*24*60*60*1e3),document.cookie=`${e}=${encodeURIComponent(n)};expires=${r.toUTCString()};path=/`},deleteCookie(e){this.setCookie(e,"",-1)}},B={getTimeString(e,n=!1){return n?new Date().toLocaleString(e,{hour12:!0}):new Date().toLocaleString("chinese",{hour12:!1})},diffDays(e,n){const t=new Date(e).getTime(),r=new Date(n).getTime();return t>r?Math.abs(Math.floor((t-r)/(24*3600*1e3))):Math.abs(Math.floor((r-t)/(24*3600*1e3)))},uniqueId(){return Date.now().toString(36)+Math.random().toString(36).substr(2,5)},getWhichDays(e,n,t){let r=t;for(let o=1;o<n;o++)switch(o){case 1:case 3:case 5:case 7:case 8:case 10:case 12:r+=31;break;case 2:S.isLeapYear(e)?r+=29:r+=28;break;default:r+=30;break}return r},getTimeStringAutoShort2(e,n){const t=new Date,r=new Date(e),o=t.getFullYear(),s=t.getMonth()+1,c=t.getDate(),l=r.getFullYear(),i=r.getMonth()+1,h=r.getDate();let a="";const u=n?" "+this.formatDate(r,"hh:mm"):"";if(o===l){const g=t.getTime()-e;if(s===i&&c===h)g<60*1e3?a="刚刚":a=this.formatDate(r,"hh:mm");else{const p=new Date;p.setDate(p.getDate()-1);const b=new Date;if(b.setDate(b.getDate()-2),i===p.getMonth()+1&&h===p.getDate())a="昨天"+u;else if(i===b.getMonth()+1&&h===b.getDate())a="前天"+u;else if(g/36e5<=7*24){const m=new Array(7);m[0]="星期日",m[1]="星期一",m[2]="星期二",m[3]="星期三",m[4]="星期四",m[5]="星期五",m[6]="星期六",a=m[r.getDay()]+u}else a=this.formatDate(r,"yyyy/M/d")+u}}else a=this.formatDate(r,"yyyy/M/d")+u;return a},formatDate(e,n){const t={"M+":e.getMonth()+1,"d+":e.getDate(),"h+":e.getHours(),"m+":e.getMinutes(),"s+":e.getSeconds(),"q+":Math.floor((e.getMonth()+3)/3),S:e.getMilliseconds()};/(y+)/.test(n)&&(n=n.replace(RegExp.$1,(e.getFullYear()+"").substr(4-RegExp.$1.length)));for(const r in t)new RegExp("("+r+")").test(n)&&(n=n.replace(RegExp.$1,RegExp.$1.length===1?t[r]:("00"+t[r]).substr((""+t[r]).length)));return n}},C={getOffsetTop(e){if(!e)throw new Error("Element is not provided");if(e instanceof SVGElement){const t=e.getBoundingClientRect(),r=window.pageYOffset||document.documentElement.scrollTop;return t.top+r}let n=0;for(;e;)n+=e.offsetTop,e=e.offsetParent;return n},getScrollValue(){const e={scrollLeft:0,scrollTop:0};return e.scrollLeft=document.body.scrollLeft||document.documentElement.scrollLeft,e.scrollTop=document.body.scrollTop||document.documentElement.scrollTop,e},getPageValue(e){e=e||window.event;const n=e.pageX||e.clientX+this.getScrollValue().scrollLeft,t=e.pageY||e.clientY+this.getScrollValue().scrollTop;return{pageX:n,pageY:t}},addEventListener(e,n,t){e.addEventListener?e.addEventListener(n,t):e.attachEvent?e.attachEvent("on"+n,t):e["on"+n]=t},getViewportWidth(){return window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth},getViewportHeight(){return window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight}},x={saveAsBlob(e,n){const t=document.createElement("a"),r=window.URL.createObjectURL(e);t.href=r,t.download=n,document.body.appendChild(t),t.click(),URL.revokeObjectURL(r),document.body.removeChild(t)},saveAsUrl(e,n){const t=document.createElement("a");t.href=e,t.download=n,document.body.appendChild(t),t.click(),URL.revokeObjectURL(e),document.body.removeChild(t)}},D={animate(e,n){let t=-1;const r=e.series[0].data.length;let o;o=setInterval(()=>{n.dispatchAction({type:"downplay",seriesIndex:0,dataIndex:t}),t=(t+1)%r,n.dispatchAction({type:"highlight",seriesIndex:0,dataIndex:t}),n.dispatchAction({type:"showTip",seriesIndex:0,dataIndex:t}),t>r&&(t=0)},2e3),n.on("mouseover",()=>{clearInterval(o),n.dispatchAction({type:"downplay",seriesIndex:0,dataIndex:t})})}},R={sortFromA2Z(e){return e?.length?e.sort((t,r)=>{const o=t.toUpperCase(),s=r.toUpperCase();return o<s?-1:o>s?1:0}):void 0}},v={degrees2Radians(e){return e*Math.PI/180},getDistance(e,n,t,r){const o=this.degrees2Radians(e),s=this.degrees2Radians(t),c=o-s,l=this.degrees2Radians(n)-this.degrees2Radians(r);let i=2*Math.asin(Math.sqrt(Math.pow(Math.sin(c/2),2)+Math.cos(o)*Math.cos(s)*Math.pow(Math.sin(l/2),2)));return i=i*6378.137,i=Math.round(i*1e4)/1e4,i=+i.toFixed(2),console.log("经纬度计算的距离为:"+i),i},calculateDistanceByHaversine(e,n,t="km"){const r=this,o=e.longitude??e.lng,s=e.latitude??e.lat,c=n.longitude??n.lng,l=n.latitude??n.lat;if(o===void 0||s===void 0||c===void 0||l===void 0)throw new Error("无效的坐标格式,缺少经纬度信息");const i=6371,h=r.degrees2Radians(s),a=r.degrees2Radians(l),u=r.degrees2Radians(l-s),f=r.degrees2Radians(c-o),y=Math.sin(u/2)*Math.sin(u/2)+Math.cos(h)*Math.cos(a)*Math.sin(f/2)*Math.sin(f/2),g=2*Math.atan2(Math.sqrt(y),Math.sqrt(1-y)),p=i*g;switch(t){case"m":return p*1e3;case"mi":return p*.621371;case"nmi":return p*.539957;default:return p}},calculateDistancesByHaversine(e,n="km",t=!1){if(e.length<2)return{segments:[],total:0};const r=[];let o=0;for(let s=0;s<e.length-1;s++){const c=this.calculateDistanceByHaversine(e[s],e[s+1],n);r.push(c),o+=c}if(t&&e.length>2){const s=this.calculateDistanceByHaversine(e[e.length-1],e[0],n);r.push(s),o+=s}return{segments:r,total:o}}};class T{static toStandardFormat(n){try{const t=typeof n=="string"?parseFloat(n):n;if(isNaN(t))throw new Error("输入不是有效的数字");if(!isFinite(t))throw new Error("输入是无穷大");return t.toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g,",")}catch(t){return console.error("格式化失败:",t),"格式错误"}}static toChineseFormat(n){try{const t=typeof n=="string"?parseFloat(n):n;if(isNaN(t))throw new Error("输入不是有效的数字");if(t>9999999999999e-2||t<-9999999999999e-2)throw new Error("输入数字超出范围");const r=t<0,o=Math.abs(t),s=Math.floor(o),c=Math.round((o-s)*100),l=["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"],i=["","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟"],h=["角","分"];let a="",u=s;if(u===0)a=l[0];else{let g=0;for(;u>0;){const p=u%10;p!==0?a=l[p]+i[g]+a:a.charAt(0)!==l[0]&&(a=l[p]+a),u=Math.floor(u/10),g++}a=a.replace(/零+/g,"零"),a=a.replace(/零+$/,"")}let f="";if(c>0){const g=Math.floor(c/10),p=c%10;g>0&&(f+=l[g]+h[0]),p>0&&(f+=l[p]+h[1])}else f="整";let y=(r?"负":"")+a+"圆"+f;return y==="零圆整"&&(y="零圆"),y}catch(t){return console.error("转换失败:",t),"格式错误"}}}const O={desensitizeChineseName(e,n={}){const{keepLength:t=1,keepLast:r=!1}=n;if(!e||e.length===0||e.trim().length===0)throw new Error("姓名不能为空");if(typeof e!="string")throw new Error("姓名必须是字符串");if(e.length<=1)return e;const o=["欧阳","司马","上官","东方","独孤","南宫","闻人","夏侯","诸葛","尉迟","公孙","长孙","宇文","司徒","慕容"];n.compoundSurname&&n.compoundSurname.trim().length>0&&!o.includes(n.compoundSurname)&&o.push(n.compoundSurname);let s="";o.some(l=>e.startsWith(l))?s=o.find(l=>e.startsWith(l))||"":s=e[0]||"";const c=Math.max(t,s.length);if(c>=e.length)return e;if(r&&e.length>2){const l=e.slice(0,c),i=e.slice(-1),h=e.length-c-1;return`${l}${"*".repeat(h)}${i}`}return`${e.slice(0,c)}${"*".repeat(e.length-c)}`}},L={...Object.freeze(Object.defineProperty({__proto__:null,toLetter:e=>e>25||e<0?"":"ABCDEFGHIJKLMNOPQRSTUVWXYZ"[e]},Symbol.toStringTag,{value:"Module"})),...Object.freeze(Object.defineProperty({__proto__:null,toMoney:e=>e.toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g,",")},Symbol.toStringTag,{value:"Module"})),isNumber(e){return typeof e=="number"&&!isNaN(e)}},I={isEmptyObject(e){return!e||JSON.stringify(e)==="{}"?!0:Object.keys(e).length===0&&e.constructor===Object},copy(e,n){for(const t in e)n[t]=e[t]},deepCopy(e,n){for(const t in e){const r=e[t];r instanceof Object?(n[t]={},this.deepCopy(r,n[t])):r instanceof Array?(n[t]=[],this.deepCopy(r,n[t])):n[t]=e[t]}}},j={desensitize(e){return e?e.replace(/^(\d{3})\d{4}(\d{4})$/,"$1****$2")||e.slice(0,3)+"****"+e.slice(7):""}},k={color:function(){return`#${Math.random().toString(16).slice(2,8)}`},int(e,n){return Math.floor(Math.random()*(n-e+1))+e},uniqueId(){return Date.now().toString(36)+Math.random().toString(36).substr(2,5)}},_={mobile:/^1[3-9]\d{9}$/,email:/^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/,chinese:/^[\u4e00-\u9fa5]+$/,english:/^[a-zA-Z]+$/,chineseStart:/^[\u4e00-\u9fa5]+\w*$/,integer:/^\d+$/,integerAndzero:/^(0|[1-9]+[0-9]*)$/,strongPassword:/^(?!.*[\s\p{C}])(?:(?=.*[A-Z])(?=.*[a-z])(?=.*[\d\W])|(?=.*\d)(?=.*[^\w\s])).{8,}$/u,decimal:/^0\.(0[1-9]|[1-9][0-9]*)$/},H={getLocal(e){return localStorage.getItem(e)},setLocal(e,n){localStorage.setItem(e,n)},removeLocal(e){localStorage.removeItem(e)},getSession(e){return sessionStorage.getItem(e)},setSession(e,n){sessionStorage.setItem(e,n)},removeSession(e){sessionStorage.removeItem(e)}},$={isExist(e,n){if(!e||!n)return!1;const t=e.split(",");return console.log("判断某元素是否在字符串中",t.indexOf(n)===-1),t.indexOf(n)!==-1},includes(e,n){return!e||!n?!1:e.includes(n)},isJSON(e){try{return JSON.parse(e),!0}catch{return!1}},indexsOfAppear(e,n){let t=-1;const r=[];do t=e.indexOf(n,t+1),t!==-1&&r.push(t);while(t!==-1);return r},getMaxTimesAndVal(e){const n=[0,""],t={};for(let s=0;s<e.length;s++){const c=e.charAt(s);t[c]?t[c]++:t[c]=1}let r=1;for(const s in t)r<t[s]&&(r=t[s]);const o=[];for(const s in t)r==t[s]&&o.push(s);return n[0]=r,n[1]=o.join(),n},mask(e,n,t){if(!e)throw new Error("字符串为空");if(typeof n!="number"||typeof t!="number")throw new Error("开始位置或结束位置为空");if(n<0||t>e.length||n>t)throw new Error("开始位置小于0或结束位置超出字符串长度或开始位置大于结束位置");return e.slice(0,n)+"*".repeat(t-n+1)+e.slice(t)}},F=e=>{const t=new RegExp("[?&]"+e+"=([^&#]*)","gi").exec(window.location.href);return t?decodeURIComponent(t[1]):null};function N(e){return new URLSearchParams(window.location.search).get(e)}const q={...Object.freeze(Object.defineProperty({__proto__:null,getQueryInfoByName:F,getQueryParam:N},Symbol.toStringTag,{value:"Module"})),getHost(){return window.location.host},getPath(){return window.location.pathname}},P={toList(e,n=2){console.log(e,n);const t={};for(let o=0;o<n;o++)t[o]=[];e.forEach((o,s)=>t[s%n].push(o));const r=[];for(const o in t)r.push(...t[o]);return r},jsLayout(e,n,t){const r=e.offsetWidth,o=n[0].offsetWidth,s=parseInt((r/o).toString()),c=(r-o*s)/(s-1),l=[];for(let i=0,h=n.length;i<h;i++){const a=n[i];if(i<s)a.style.left=(o+c)*i+"px",l[i]=a.offsetHeight;else{const{index:u,value:f}=A.getMinValueAndIndex(l);a.style.left=(o+c)*u+"px",a.style.top=f+t+"px",l[u]=a.offsetHeight+t+f}}}};d.Base64Utils=M,d.MoneyFormatter=T,d.arrayUtils=A,d.booleanUtils=S,d.commonUtils=E,d.cookieUtils=U,d.dateUtils=B,d.documentUtils=C,d.downloadUtils=x,d.echartsUtils=D,d.letterUtils=R,d.mapUtils=v,d.nameUtils=O,d.numberUtils=L,d.objectUtils=I,d.phoneUtils=j,d.randomUtils=k,d.regexpUtils=_,d.storageUtils=H,d.stringUtils=$,d.urlUtils=q,d.waterfallUtils=P,Object.defineProperty(d,Symbol.toStringTag,{value:"Module"})});
|
|
1
|
+
(function(f,m){typeof exports=="object"&&typeof module<"u"?m(exports):typeof define=="function"&&define.amd?define(["exports"],m):(f=typeof globalThis<"u"?globalThis:f||self,m(f.yhkitUtils={}))})(this,function(f){"use strict";const M={...{toEnumObj(e,n="value"){if(!e||!e.length)return{};const t={};return e.forEach(r=>{const o=Object.assign({label:r.label,text:r.label},r);t[r[n]]=o}),t}},...{uniqueBySet(e){if(!e)throw new Error("数组不能为空");const n=e;return Array.from(new Set(n))},uniqueByFilter(e){if(!e)throw new Error("数组不能为空");return e.filter((t,r,o)=>r===o.indexOf(t))},uniqueByReduce(e){if(!e)throw new Error("数组不能为空");return e.reduce((t,r)=>(t.includes(r)||t.push(r),t),[])},uniqueByIncludes(e){if(!e)throw new Error("数组不能为空");const n=e,t=[];return n.forEach(r=>{t.includes(r)||t.push(r)}),t},uniqueByFor(e){if(!e)throw new Error("数组不能为空");const n=e,t=[];for(let r=0;r<n.length;r++)t.includes(n[r])||t.push(n[r]);return t},uniqueByKey(e,n){if(!e||!n)throw new Error("数组不能为空或键名不能为空");const t=e,r=new Map;return t.filter(o=>r.has(o[n])?!1:(r.set(o[n],!0),!0))},unique(e,n={}){const{keys:t,compareFn:r}=n;if(!e)throw new Error("数组不能为空");const o=e;if(!t&&!r)return this.uniqueBySet(o);if(t){const s=new Map;return o.filter(a=>{const l=t.map(i=>a[i]).join("|");return s.has(l)?!1:(s.set(l,!0),!0)})}if(r)return o.filter((s,a,l)=>a===l.findIndex(i=>r(s,i)))}},...{isExistByIndexOf(e,n){return!e||!n?!1:e.indexOf(n)!==-1},isExistByIncludes(e,n){return!e||!n?!1:e.includes(n)}},...{sort(e,n="asc"){return e?e.sort((t,r)=>n==="asc"?t>r?1:-1:t<r?1:-1):[]}},...{getMaxValue(e){return e?Math.max(...e):0},getMinValue(e){return e?Math.min(...e):0},getMinValueAndIndex(e){if(e.length===0)return{value:0,index:0};const n={value:e[0],index:0};for(let t=1,r=e.length;t<r;t++){const o=e[t];n.value>o&&(n.value=o,n.index=t)}return n},getMaxValueAndIndex(e){return e.length===0?{value:0,index:0}:e.reduce((n,t,r)=>t<n.value?{value:t,index:r}:n,{value:e[0],index:0})}},...{countOfAppear(e,n){let t=0;for(const r of e)r===n&&t++;return t},indexsOfAppear(e,n){let t=-1;const r=[];do t=e.indexOf(n,t+1),t!==-1&&r.push(t);while(t!==-1);return r}},...{shuffle(e){if(!e)return[];const n=[...e];for(let t=n.length-1;t>0;t--){const r=Math.floor(Math.random()*(t+1));[n[t],n[r]]=[n[r],n[t]]}return n},sample(e,n){if(!e)return[];if(n<=0||n>e.length)throw new Error("抽样次数必须在1次到数组长度之间");const t=[...e];for(let r=0;r<n;r++){const o=Math.floor(Math.random()*(e.length-r))+r;[t[r],t[o]]=[t[o],t[r]]}return t.slice(0,n)},sampleByStart(e,n){if(!e)return[];if(n<=0||n>e.length)throw new Error("抽样次数必须在1次到数组长度之间");const t=[...e];for(let r=n-1;r>=0;r--){const o=Math.floor(Math.random()*(e.length-r))+r;[t[r],t[o]]=[t[o],t[r]]}return t.slice(0,n)},sampleByEnd(e,n){if(!e)return[];if(n<=0||n>e.length)throw new Error("抽样次数必须在1次到数组长度之间");const t=[...e];for(let r=e.length-1;r>=e.length-n;r--){const o=Math.floor(Math.random()*(r+1));[t[r],t[o]]=[t[o],t[r]]}return t.slice(e.length-n)}}};class U{static BASE64_CHARS="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";static toBlob(n,t="",r=512){const s=(n.split(",")[1]||n).replace(/-/g,"+").replace(/_/g,"/"),a="=".repeat((4-s.length%4)%4),l=s+a;try{const i=atob(l),h=[];for(let c=0;c<i.length;c+=r){const u=i.slice(c,c+r),d=new Array(u.length);for(let g=0;g<u.length;g++)d[g]=u.charCodeAt(g);const y=new Uint8Array(d);h.push(y)}return new Blob(h,{type:t})}catch(i){return console.error("Failed to convert base64 to blob:",i),null}}static toFile(n,t="file.txt",r="text/plain"){const s=n.replace(/^data:.+;base64,/,"").replace(/-/g,"+").replace(/_/g,"/"),a="=".repeat((4-s.length%4)%4),l=s+a,i=atob(l),h=[];for(let u=0;u<i.length;u+=512){const d=i.slice(u,u+512),y=new Array(d.length);for(let g=0;g<d.length;g++)y[g]=d.charCodeAt(g);h.push(new Uint8Array(y))}const c=new Blob(h,{type:r});return new File([c],t,{type:r})}static encode(n){if(!n)return"";const t=this._stringToUtf8Bytes(n);return this._bytesToBase64(t)}static decode(n){if(!n)return"";n=n.replace(/\s/g,"");const t=this._base64ToBytes(n);return this._utf8BytesToString(t)}static _stringToUtf8Bytes(n){const t=[];for(let r=0;r<n.length;r++){let o=n.charCodeAt(r);if(o<128)t.push(o);else if(o<2048)t.push(192|o>>6),t.push(128|o&63);else if(o<55296||o>=57344)t.push(224|o>>12),t.push(128|o>>6&63),t.push(128|o&63);else{r++;const s=o,a=n.charCodeAt(r);if(isNaN(a))throw new Error("代理对不完整");o=65536+((s&1023)<<10)+(a&1023),t.push(240|o>>18),t.push(128|o>>12&63),t.push(128|o>>6&63),t.push(128|o&63)}}return t}static _utf8BytesToString(n){let t="",r=0;for(;r<n.length;){const o=n[r++];if(o<128)t+=String.fromCharCode(o);else if(o>=192&&o<224){const s=n[r++]&63;t+=String.fromCharCode((o&31)<<6|s)}else if(o>=224&&o<240){const s=n[r++]&63,a=n[r++]&63;t+=String.fromCharCode((o&15)<<12|s<<6|a)}else if(o>=240&&o<248){const s=n[r++]&63,a=n[r++]&63,l=n[r++]&63,i=(o&7)<<18|s<<12|a<<6|l,h=Math.floor((i-65536)/1024)+55296,c=(i-65536)%1024+56320;t+=String.fromCharCode(h,c)}else t+="�"}return t}static _bytesToBase64(n){let t="",r=0;for(;r<n.length;){const o=n[r++],s=r<n.length,a=s?n[r++]:0,l=r<n.length,i=l?n[r++]:0,h=o>>2,c=(o&3)<<4|a>>4,u=(a&15)<<2|i>>6,d=i&63;s?l?t+=this.BASE64_CHARS.charAt(h)+this.BASE64_CHARS.charAt(c)+this.BASE64_CHARS.charAt(u)+this.BASE64_CHARS.charAt(d):t+=this.BASE64_CHARS.charAt(h)+this.BASE64_CHARS.charAt(c)+this.BASE64_CHARS.charAt(u)+"=":t+=this.BASE64_CHARS.charAt(h)+this.BASE64_CHARS.charAt(c)+"=="}return t}static _base64ToBytes(n){const t=n.length;let r=0;t>=2&&(n[t-1]==="="&&r++,n[t-2]==="="&&r++);const o=Math.floor(t*3/4)-r,s=new Array(o),a=new Array(256).fill(-1);for(let h=0;h<this.BASE64_CHARS.length;h++)a[this.BASE64_CHARS.charCodeAt(h)]=h;let l=0,i=0;for(;i<t;){const h=a[n.charCodeAt(i++)],c=a[n.charCodeAt(i++)],u=i<t?a[n.charCodeAt(i++)]:-1,d=i<t?a[n.charCodeAt(i++)]:-1;if(h===-1||c===-1)throw new Error("无效的 Base64 字符");const y=h<<2|c>>4;if(s[l++]=y,u!==-1){const g=(c&15)<<4|u>>2;if(s[l++]=g,d!==-1){const p=(u&3)<<6|d;s[l++]=p}}}return s}}const S={isEmptyString(e){return typeof e=="string"&&e.trim()===""},isNumber(e){return typeof e=="number"&&!isNaN(e)},isObject(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)},isEmptyObject(e){return e?Object.keys(e).length===0&&e.constructor===Object:!0},isBoolean(e){return typeof e=="boolean"},isArray(e){return Array.isArray(e)},isFunction(e){return typeof e=="function"},isPromise(e){return!!e&&(typeof e=="object"||typeof e=="function")&&typeof e.then=="function"},isElement(e){return e instanceof Element},isPhone(e){return/^1[3-9]\d{9}$/.test(e)},isEmail(e){return/^[\w.-]+@[\w.-]+\.\w+$/.test(e)},isJSON(e){try{return JSON.parse(e),!0}catch{return!1}},isImageLoaded(e){return e.complete&&e.naturalWidth!==0},isInViewport(e){const n=e.getBoundingClientRect();return n.top>=0&&n.left>=0&&n.bottom<=window.innerHeight&&n.right<=window.innerWidth},isLeapYear(e){return e%4===0&&e%100!==0||e%400===0},isMobile(){return/Mobi|Android|iPhone/i.test(navigator.userAgent)}},b={isEmptyObject(e){return e?Object.keys(e).length===0&&e.constructor===Object:!0},copy(e,n){for(const t in e)n[t]=e[t]},deepCopy(e,n){for(const t in e){const r=e[t];r instanceof Object?(n[t]={},this.deepCopy(r,n[t])):r instanceof Array?(n[t]=[],this.deepCopy(r,n[t])):n[t]=e[t]}}},E={...{getType(e){return Object.prototype.toString.call(e).replace(/\[object\s(\w+)\]/,"$1")}},...{shallowClone(e){if(e===null||typeof e!="object")return e;if(b.isEmptyObject(e))return{};const n={};for(const t in e)n[t]=e[t];return n},deepCloneByJSON(e){return e===null||typeof e!="object"?e:b.isEmptyObject(e)?{}:JSON.parse(JSON.stringify(e))},deepCloneByMap(e,n=new WeakMap){if(e===null||typeof e!="object")return e;if(b.isEmptyObject(e))throw new Error("空对象不能进行深拷贝");if(n.has(e))return n.get(e);const t=E.getType(e);let r;switch(t){case"object":case"array":r=Array.isArray(e)?[]:{};break;case"Date":r=new Date(e);break;case"RegExp":r=new RegExp(e);break;case"Map":r=new Map(e);break;case"Set":r=new Set(e);break;default:return e}return n.set(e,r),t==="Map"?(e.forEach((o,s)=>{r.set(this.deepCloneByMap(s,n),this.deepCloneByMap(o,n))}),r):t==="Set"?(e.forEach(o=>{r.add(this.deepCloneByMap(o,n))}),r):(Reflect.ownKeys(e).forEach(o=>{r[o]=this.deepCloneByMap(e[o],n)}),r)}}},B={getCookie(e){if(!e)return;const n=document.cookie.match(new RegExp("(^| )"+e+"=([^;]+)"));return n?decodeURIComponent(n[2]):null},setCookie(e,n,t=7){const r=new Date;r.setTime(r.getTime()+t*24*60*60*1e3),document.cookie=`${e}=${encodeURIComponent(n)};expires=${r.toUTCString()};path=/`},deleteCookie(e){this.setCookie(e,"",-1)}},C={getTimeString(e,n=!1){return n?new Date().toLocaleString(e,{hour12:!0}):new Date().toLocaleString("chinese",{hour12:!1})},diffDays(e,n){const t=new Date(e).getTime(),r=new Date(n).getTime();return t>r?Math.abs(Math.floor((t-r)/(24*3600*1e3))):Math.abs(Math.floor((r-t)/(24*3600*1e3)))},uniqueId(){return Date.now().toString(36)+Math.random().toString(36).substr(2,5)},getWhichDays(e,n,t){let r=t;for(let o=1;o<n;o++)switch(o){case 1:case 3:case 5:case 7:case 8:case 10:case 12:r+=31;break;case 2:S.isLeapYear(e)?r+=29:r+=28;break;default:r+=30;break}return r},getTimeStringAutoShort2(e,n){const t=new Date,r=new Date(e),o=t.getFullYear(),s=t.getMonth()+1,a=t.getDate(),l=r.getFullYear(),i=r.getMonth()+1,h=r.getDate();let c="";const u=n?" "+this.formatDate(r,"hh:mm"):"";if(o===l){const g=t.getTime()-e;if(s===i&&a===h)g<60*1e3?c="刚刚":c=this.formatDate(r,"hh:mm");else{const p=new Date;p.setDate(p.getDate()-1);const A=new Date;if(A.setDate(A.getDate()-2),i===p.getMonth()+1&&h===p.getDate())c="昨天"+u;else if(i===A.getMonth()+1&&h===A.getDate())c="前天"+u;else if(g/36e5<=7*24){const w=new Array(7);w[0]="星期日",w[1]="星期一",w[2]="星期二",w[3]="星期三",w[4]="星期四",w[5]="星期五",w[6]="星期六",c=w[r.getDay()]+u}else c=this.formatDate(r,"yyyy/M/d")+u}}else c=this.formatDate(r,"yyyy/M/d")+u;return c},formatDate(e,n){const t={"M+":e.getMonth()+1,"d+":e.getDate(),"h+":e.getHours(),"m+":e.getMinutes(),"s+":e.getSeconds(),"q+":Math.floor((e.getMonth()+3)/3),S:e.getMilliseconds()};/(y+)/.test(n)&&(n=n.replace(RegExp.$1,(e.getFullYear()+"").substr(4-RegExp.$1.length)));for(const r in t)new RegExp("("+r+")").test(n)&&(n=n.replace(RegExp.$1,RegExp.$1.length===1?t[r]:("00"+t[r]).substr((""+t[r]).length)));return n}},x={getOffsetTop(e){if(!e)throw new Error("Element is not provided");if(e instanceof SVGElement){const t=e.getBoundingClientRect(),r=window.pageYOffset||document.documentElement.scrollTop;return t.top+r}let n=0;for(;e;)n+=e.offsetTop,e=e.offsetParent;return n},getScrollValue(){const e={scrollLeft:0,scrollTop:0};return e.scrollLeft=document.body.scrollLeft||document.documentElement.scrollLeft,e.scrollTop=document.body.scrollTop||document.documentElement.scrollTop,e},getPageValue(e){e=e||window.event;const n=e.pageX||e.clientX+this.getScrollValue().scrollLeft,t=e.pageY||e.clientY+this.getScrollValue().scrollTop;return{pageX:n,pageY:t}},addEventListener(e,n,t){e.addEventListener?e.addEventListener(n,t):e.attachEvent?e.attachEvent("on"+n,t):e["on"+n]=t},getViewportWidth(){return window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth},getViewportHeight(){return window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight}},R={saveAsBlob(e,n){const t=document.createElement("a"),r=window.URL.createObjectURL(e);t.href=r,t.download=n,document.body.appendChild(t),t.click(),URL.revokeObjectURL(r),document.body.removeChild(t)},saveAsUrl(e,n){const t=document.createElement("a");t.href=e,t.download=n,document.body.appendChild(t),t.click(),URL.revokeObjectURL(e),document.body.removeChild(t)}},D={animate(e,n){let t=-1;const r=e.series[0].data.length;let o;o=setInterval(()=>{n.dispatchAction({type:"downplay",seriesIndex:0,dataIndex:t}),t=(t+1)%r,n.dispatchAction({type:"highlight",seriesIndex:0,dataIndex:t}),n.dispatchAction({type:"showTip",seriesIndex:0,dataIndex:t}),t>r&&(t=0)},2e3),n.on("mouseover",()=>{clearInterval(o),n.dispatchAction({type:"downplay",seriesIndex:0,dataIndex:t})})}},O={sortFromA2Z(e){return e?.length?e.sort((t,r)=>{const o=t.toUpperCase(),s=r.toUpperCase();return o<s?-1:o>s?1:0}):void 0}},T={degrees2Radians(e){return e*Math.PI/180},getDistance(e,n,t,r){const o=this.degrees2Radians(e),s=this.degrees2Radians(t),a=o-s,l=this.degrees2Radians(n)-this.degrees2Radians(r);let i=2*Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2)+Math.cos(o)*Math.cos(s)*Math.pow(Math.sin(l/2),2)));return i=i*6378.137,i=Math.round(i*1e4)/1e4,i=+i.toFixed(2),console.log("经纬度计算的距离为:"+i),i},calculateDistanceByHaversine(e,n,t="km"){const r=this,o=e.longitude??e.lng,s=e.latitude??e.lat,a=n.longitude??n.lng,l=n.latitude??n.lat;if(o===void 0||s===void 0||a===void 0||l===void 0)throw new Error("无效的坐标格式,缺少经纬度信息");const i=6371,h=r.degrees2Radians(s),c=r.degrees2Radians(l),u=r.degrees2Radians(l-s),d=r.degrees2Radians(a-o),y=Math.sin(u/2)*Math.sin(u/2)+Math.cos(h)*Math.cos(c)*Math.sin(d/2)*Math.sin(d/2),g=2*Math.atan2(Math.sqrt(y),Math.sqrt(1-y)),p=i*g;switch(t){case"m":return p*1e3;case"mi":return p*.621371;case"nmi":return p*.539957;default:return p}},calculateDistancesByHaversine(e,n="km",t=!1){if(e.length<2)return{segments:[],total:0};const r=[];let o=0;for(let s=0;s<e.length-1;s++){const a=this.calculateDistanceByHaversine(e[s],e[s+1],n);r.push(a),o+=a}if(t&&e.length>2){const s=this.calculateDistanceByHaversine(e[e.length-1],e[0],n);r.push(s),o+=s}return{segments:r,total:o}}};class j{static toStandardFormat(n){try{const t=typeof n=="string"?parseFloat(n):n;if(isNaN(t))throw new Error("输入不是有效的数字");if(!isFinite(t))throw new Error("输入是无穷大");return t.toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g,",")}catch(t){return console.error("格式化失败:",t),"格式错误"}}static toChineseFormat(n){try{const t=typeof n=="string"?parseFloat(n):n;if(isNaN(t))throw new Error("输入不是有效的数字");if(t>9999999999999e-2||t<-9999999999999e-2)throw new Error("输入数字超出范围");const r=t<0,o=Math.abs(t),s=Math.floor(o),a=Math.round((o-s)*100),l=["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"],i=["","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟"],h=["角","分"];let c="",u=s;if(u===0)c=l[0];else{let g=0;for(;u>0;){const p=u%10;p!==0?c=l[p]+i[g]+c:c.charAt(0)!==l[0]&&(c=l[p]+c),u=Math.floor(u/10),g++}c=c.replace(/零+/g,"零"),c=c.replace(/零+$/,"")}let d="";if(a>0){const g=Math.floor(a/10),p=a%10;g>0&&(d+=l[g]+h[0]),p>0&&(d+=l[p]+h[1])}else d="整";let y=(r?"负":"")+c+"圆"+d;return y==="零圆整"&&(y="零圆"),y}catch(t){return console.error("转换失败:",t),"格式错误"}}}const v={desensitizeChineseName(e,n={}){const{keepLength:t=1,keepLast:r=!1}=n;if(!e||e.length===0||e.trim().length===0)throw new Error("姓名不能为空");if(typeof e!="string")throw new Error("姓名必须是字符串");if(e.length<=1)return e;const o=["欧阳","司马","上官","东方","独孤","南宫","闻人","夏侯","诸葛","尉迟","公孙","长孙","宇文","司徒","慕容"];n.compoundSurname&&n.compoundSurname.trim().length>0&&!o.includes(n.compoundSurname)&&o.push(n.compoundSurname);let s="";o.some(l=>e.startsWith(l))?s=o.find(l=>e.startsWith(l))||"":s=e[0]||"";const a=Math.max(t,s.length);if(a>=e.length)return e;if(r&&e.length>2){const l=e.slice(0,a),i=e.slice(-1),h=e.length-a-1;return`${l}${"*".repeat(h)}${i}`}return`${e.slice(0,a)}${"*".repeat(e.length-a)}`}},L={...Object.freeze(Object.defineProperty({__proto__:null,toLetter:e=>e>25||e<0?"":"ABCDEFGHIJKLMNOPQRSTUVWXYZ"[e]},Symbol.toStringTag,{value:"Module"})),...Object.freeze(Object.defineProperty({__proto__:null,toMoney:e=>e.toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g,",")},Symbol.toStringTag,{value:"Module"})),isNumber(e){return typeof e=="number"&&!isNaN(e)}},I={desensitize(e){return e?e.replace(/^(\d{3})\d{4}(\d{4})$/,"$1****$2")||e.slice(0,3)+"****"+e.slice(7):""}},_={color:function(){return`#${Math.random().toString(16).slice(2,8)}`},int(e,n){return Math.floor(Math.random()*(n-e+1))+e},uniqueId(){return Date.now().toString(36)+Math.random().toString(36).substr(2,5)}},k={mobile:/^1[3-9]\d{9}$/,email:/^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/,chinese:/^[\u4e00-\u9fa5]+$/,english:/^[a-zA-Z]+$/,chineseStart:/^[\u4e00-\u9fa5]+\w*$/,integer:/^\d+$/,integerAndzero:/^(0|[1-9]+[0-9]*)$/,strongPassword:/^(?!.*[\s\p{C}])(?:(?=.*[A-Z])(?=.*[a-z])(?=.*[\d\W])|(?=.*\d)(?=.*[^\w\s])).{8,}$/u,decimal:/^0\.(0[1-9]|[1-9][0-9]*)$/},H={getLocal(e){return localStorage.getItem(e)},setLocal(e,n){localStorage.setItem(e,n)},removeLocal(e){localStorage.removeItem(e)},getSession(e){return sessionStorage.getItem(e)},setSession(e,n){sessionStorage.setItem(e,n)},removeSession(e){sessionStorage.removeItem(e)}},$={isExist(e,n){if(!e||!n)return!1;const t=e.split(",");return console.log("判断某元素是否在字符串中",t.indexOf(n)===-1),t.indexOf(n)!==-1},includes(e,n){return!e||!n?!1:e.includes(n)},isJSON(e){try{return JSON.parse(e),!0}catch{return!1}},indexsOfAppear(e,n){let t=-1;const r=[];do t=e.indexOf(n,t+1),t!==-1&&r.push(t);while(t!==-1);return r},getMaxTimesAndVal(e){const n=[0,""],t={};for(let s=0;s<e.length;s++){const a=e.charAt(s);t[a]?t[a]++:t[a]=1}let r=1;for(const s in t)r<t[s]&&(r=t[s]);const o=[];for(const s in t)r==t[s]&&o.push(s);return n[0]=r,n[1]=o.join(),n},mask(e,n,t){if(!e)throw new Error("字符串为空");if(typeof n!="number"||typeof t!="number")throw new Error("开始位置或结束位置为空");if(n<0||t>e.length||n>t)throw new Error("开始位置小于0或结束位置超出字符串长度或开始位置大于结束位置");return e.slice(0,n)+"*".repeat(t-n+1)+e.slice(t)}},N=e=>{const t=new RegExp("[?&]"+e+"=([^&#]*)","gi").exec(window.location.href);return t?decodeURIComponent(t[1]):null};function F(e){return new URLSearchParams(window.location.search).get(e)}const q={...Object.freeze(Object.defineProperty({__proto__:null,getQueryInfoByName:N,getQueryParam:F},Symbol.toStringTag,{value:"Module"})),getHost(){return window.location.host},getPath(){return window.location.pathname}},P={toList(e,n=2){console.log(e,n);const t={};for(let o=0;o<n;o++)t[o]=[];e.forEach((o,s)=>t[s%n].push(o));const r=[];for(const o in t)r.push(...t[o]);return r},jsLayout(e,n,t){const r=e.offsetWidth,o=n[0].offsetWidth,s=parseInt((r/o).toString()),a=(r-o*s)/(s-1),l=[];for(let i=0,h=n.length;i<h;i++){const c=n[i];if(i<s)c.style.left=(o+a)*i+"px",l[i]=c.offsetHeight;else{const{index:u,value:d}=M.getMinValueAndIndex(l);c.style.left=(o+a)*u+"px",c.style.top=d+t+"px",l[u]=c.offsetHeight+t+d}}}};f.Base64Utils=U,f.MoneyFormatter=j,f.arrayUtils=M,f.booleanUtils=S,f.commonUtils=E,f.cookieUtils=B,f.dateUtils=C,f.documentUtils=x,f.downloadUtils=R,f.echartsUtils=D,f.letterUtils=O,f.mapUtils=T,f.nameUtils=v,f.numberUtils=L,f.objectUtils=b,f.phoneUtils=I,f.randomUtils=_,f.regexpUtils=k,f.storageUtils=H,f.stringUtils=$,f.urlUtils=q,f.waterfallUtils=P,Object.defineProperty(f,Symbol.toStringTag,{value:"Module"})});
|
package/package.json
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
declare const _default: {
|
|
2
2
|
/**
|
|
3
3
|
* 数组随机打乱-Fisher-Yates算法
|
|
4
|
+
* 要点:
|
|
5
|
+
* 1、倒叙遍历数组;
|
|
6
|
+
* 2、获取随机位置,并交换当前位置和随机位置的元素;
|
|
7
|
+
* 3、返回洗牌后的数组;
|
|
4
8
|
* @param arr 数组
|
|
5
9
|
* @returns 随机打乱后的数组
|
|
6
10
|
*
|
|
@@ -10,11 +14,25 @@ declare const _default: {
|
|
|
10
14
|
*/
|
|
11
15
|
shuffle<T>(arr: T[]): T[];
|
|
12
16
|
/**
|
|
13
|
-
* 数组随机抽样-Fisher-Yates算法前k次迭代,再取前k
|
|
17
|
+
* 数组随机抽样-Fisher-Yates算法前k次迭代,再取前k个元素【洗牌开头,返回开头(更常见)】
|
|
14
18
|
* @param arr 数组
|
|
15
19
|
* @param k 抽样次数
|
|
16
20
|
* @returns 抽样后的数组
|
|
17
21
|
*/
|
|
18
22
|
sample<T>(arr: T[], k: number): T[];
|
|
23
|
+
/**
|
|
24
|
+
* 数组随机抽样-Fisher-Yates算法【洗牌开头,返回开头(更常见)】
|
|
25
|
+
* @param arr 数组
|
|
26
|
+
* @param k 抽样次数
|
|
27
|
+
* @returns 抽样后的数组
|
|
28
|
+
*/
|
|
29
|
+
sampleByStart<T>(arr: T[], k: number): T[];
|
|
30
|
+
/**
|
|
31
|
+
* 数组随机抽样-Fisher-Yates算法【洗牌结尾,返回结尾(不常见)】
|
|
32
|
+
* @param arr 数组
|
|
33
|
+
* @param k 抽样次数
|
|
34
|
+
* @returns 抽样后的数组
|
|
35
|
+
*/
|
|
36
|
+
sampleByEnd<T>(arr: T[], k: number): T[];
|
|
19
37
|
};
|
|
20
38
|
export default _default;
|
package/types/array/index.d.ts
CHANGED
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
export declare const arrayUtils: {
|
|
6
6
|
readonly shuffle: <T>(arr: T[]) => T[];
|
|
7
7
|
readonly sample: <T>(arr: T[], k: number) => T[];
|
|
8
|
+
readonly sampleByStart: <T>(arr: T[], k: number) => T[];
|
|
9
|
+
readonly sampleByEnd: <T>(arr: T[], k: number) => T[];
|
|
8
10
|
readonly countOfAppear: <T>(arr: T[], target: T) => number;
|
|
9
11
|
readonly indexsOfAppear: <T>(array: T[], element: T) => number[];
|
|
10
12
|
readonly getMaxValue: (arr: number[]) => number;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
declare const _default: {
|
|
2
|
+
/**
|
|
3
|
+
* 浅拷贝
|
|
4
|
+
* @param source 需要处理的源对象
|
|
5
|
+
* @returns 浅拷贝后的新对象
|
|
6
|
+
*/
|
|
7
|
+
shallowClone(source: object): object;
|
|
8
|
+
/**
|
|
9
|
+
* 最便捷实现深克隆/拷贝
|
|
10
|
+
* 存在的问题:
|
|
11
|
+
* (1)序列化会自动忽略 undefined、Symbol、函数等特殊类型
|
|
12
|
+
* (2)序列化会将 NaN、Infinity、-Infinity 转换为 null
|
|
13
|
+
* (3)无法解决循环引用的问题。报错:TypeError: Converting circular structure to JSON
|
|
14
|
+
* @param source 任意对象
|
|
15
|
+
* @returns 深克隆/拷贝后的对象
|
|
16
|
+
*/
|
|
17
|
+
deepCloneByJSON(source: unknown): any;
|
|
18
|
+
/**
|
|
19
|
+
* 深拷贝函数
|
|
20
|
+
* (1)处理对象和数组
|
|
21
|
+
* (2)支持循环引用
|
|
22
|
+
* (3)还支持更多类型的对象,如 Date、RegExp、Error、Map、Set、Symbol、Function、Node 等
|
|
23
|
+
* @param source 任意对象
|
|
24
|
+
* @param map 用于存储已经拷贝过的对象,避免循环引用
|
|
25
|
+
* @returns 深拷贝/拷贝后的对象
|
|
26
|
+
*/
|
|
27
|
+
deepCloneByMap<T>(source: T, map?: WeakMap<object, unknown>): unknown;
|
|
28
|
+
};
|
|
29
|
+
export default _default;
|
package/types/common/index.d.ts
CHANGED
|
@@ -2,10 +2,8 @@
|
|
|
2
2
|
* 通用工具函数
|
|
3
3
|
*/
|
|
4
4
|
export declare const commonUtils: {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
*/
|
|
10
|
-
getType(val: unknown): string;
|
|
5
|
+
readonly shallowClone: (source: object) => object;
|
|
6
|
+
readonly deepCloneByJSON: (source: unknown) => any;
|
|
7
|
+
readonly deepCloneByMap: <T>(source: T, map?: WeakMap<object, unknown>) => unknown;
|
|
8
|
+
readonly getType: (val: unknown) => string;
|
|
11
9
|
};
|