@yh-kit/utils 1.17.1 → 1.18.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 +31 -22
- package/dist/utils.js +123 -57
- package/dist/utils.umd.cjs +1 -1
- package/package.json +1 -1
- package/types/common/clone.d.ts +13 -1
- package/types/common/curry.d.ts +38 -0
- package/types/common/index.d.ts +4 -0
package/README.md
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
* @Description: 实用程序合集文档
|
|
3
|
+
* @Author: YH
|
|
4
|
+
* @Date: 2026-04-16 22:56:51
|
|
5
|
+
* @LastEditors: YH
|
|
6
|
+
* @LastEditTime: 2026-06-18 18:31:01
|
|
7
|
+
* @FilePath: /vite-project/packages/utils/README.md
|
|
8
|
+
-->
|
|
9
|
+
|
|
1
10
|
# 实用程序合集
|
|
2
11
|
|
|
3
12
|
实用程序合集
|
|
@@ -14,28 +23,28 @@
|
|
|
14
23
|
|
|
15
24
|
| 函数对象名 | 描述 | 函数实现方式 | 备注 |
|
|
16
25
|
| :------ | :------ | :------ | :------ |
|
|
17
|
-
| arrayUtils | 数组相关操作工具函数 | js对象函数 |
|
|
18
|
-
| Base64Utils | Base64 相关操作工具函数 | class类 |
|
|
19
|
-
| booleanUtils | 布尔值相关操作工具函数 | js对象函数 |
|
|
20
|
-
| commonUtils | 公用工具函数 | js对象函数 |
|
|
21
|
-
| cookieUtils | Cookie 相关操作工具函数 | js对象函数 |
|
|
22
|
-
| dateUtils | 日期相关操作工具函数 | js对象函数 |
|
|
23
|
-
| documentUtils | 文档相关操作工具函数 | js对象函数 |
|
|
24
|
-
| downloadUtils | 下载相关操作工具函数 | js对象函数 |
|
|
25
|
-
| echartsUtils | Echarts 相关操作工具函数 | js对象函数 |
|
|
26
|
-
| letterUtils | 字母相关操作工具函数 | js对象函数 |
|
|
27
|
-
| mapUtils | 地图相关操作工具函数 | js对象函数 |
|
|
28
|
-
| MoneyFormatter | 金额格式化工具函数 | class类 |
|
|
29
|
-
| nameUtils | 姓名相关操作工具函数 | namespace |
|
|
30
|
-
| numberUtils | 数字相关操作工具函数 | js对象函数 |
|
|
31
|
-
| objectUtils | 对象相关操作工具函数 | js对象函数 |
|
|
32
|
-
| phoneUtils | 手机号相关操作工具函数 | js对象函数 |
|
|
33
|
-
| randomUtils | 随机数相关操作工具函数 | js对象函数 |
|
|
34
|
-
| regexpUtils | 常用正则表达式 | js对象函数 |
|
|
35
|
-
| storageUtils | 本地存储相关操作工具函数 | js对象函数 |
|
|
36
|
-
| stringUtils | 字符串相关操作工具函数 | js对象函数 |
|
|
37
|
-
| urlUtils | URL 相关操作工具函数 | js对象函数 |
|
|
38
|
-
| waterfallUtils | 瀑布流相关操作工具函数 | js对象函数 |
|
|
26
|
+
| arrayUtils | 数组相关操作工具函数 | js对象函数 | -- |
|
|
27
|
+
| Base64Utils | Base64 相关操作工具函数 | class类 | -- |
|
|
28
|
+
| booleanUtils | 布尔值相关操作工具函数 | js对象函数 | -- |
|
|
29
|
+
| commonUtils | 公用工具函数 | js对象函数 | -- |
|
|
30
|
+
| cookieUtils | Cookie 相关操作工具函数 | js对象函数 | -- |
|
|
31
|
+
| dateUtils | 日期相关操作工具函数 | js对象函数 | -- |
|
|
32
|
+
| documentUtils | 文档相关操作工具函数 | js对象函数 | -- |
|
|
33
|
+
| downloadUtils | 下载相关操作工具函数 | js对象函数 | -- |
|
|
34
|
+
| echartsUtils | Echarts 相关操作工具函数 | js对象函数 | -- |
|
|
35
|
+
| letterUtils | 字母相关操作工具函数 | js对象函数 | -- |
|
|
36
|
+
| mapUtils | 地图相关操作工具函数 | js对象函数 | -- |
|
|
37
|
+
| MoneyFormatter | 金额格式化工具函数 | class类 | -- |
|
|
38
|
+
| nameUtils | 姓名相关操作工具函数 | namespace | -- |
|
|
39
|
+
| numberUtils | 数字相关操作工具函数 | js对象函数 | -- |
|
|
40
|
+
| objectUtils | 对象相关操作工具函数 | js对象函数 | -- |
|
|
41
|
+
| phoneUtils | 手机号相关操作工具函数 | js对象函数 | -- |
|
|
42
|
+
| randomUtils | 随机数相关操作工具函数 | js对象函数 | -- |
|
|
43
|
+
| regexpUtils | 常用正则表达式 | js对象函数 | -- |
|
|
44
|
+
| storageUtils | 本地存储相关操作工具函数 | js对象函数 | -- |
|
|
45
|
+
| stringUtils | 字符串相关操作工具函数 | js对象函数 | -- |
|
|
46
|
+
| urlUtils | URL 相关操作工具函数 | js对象函数 | -- |
|
|
47
|
+
| waterfallUtils | 瀑布流相关操作工具函数 | js对象函数 | -- |
|
|
39
48
|
|
|
40
49
|
## 使用
|
|
41
50
|
|
package/dist/utils.js
CHANGED
|
@@ -41,7 +41,7 @@ const b = {
|
|
|
41
41
|
t[r[n]] = o;
|
|
42
42
|
}), t;
|
|
43
43
|
}
|
|
44
|
-
},
|
|
44
|
+
}, S = {
|
|
45
45
|
/**
|
|
46
46
|
* 判断某元素是否在存在于数组中(indexOf方法)
|
|
47
47
|
* @param arr 数组
|
|
@@ -60,7 +60,7 @@ const b = {
|
|
|
60
60
|
isExistByIncludes(e, n) {
|
|
61
61
|
return !e || !n ? !1 : e.includes(n);
|
|
62
62
|
}
|
|
63
|
-
},
|
|
63
|
+
}, M = {
|
|
64
64
|
/**
|
|
65
65
|
* 获取数组中的最大值
|
|
66
66
|
* @param arr 数组
|
|
@@ -326,17 +326,17 @@ const b = {
|
|
|
326
326
|
// 数组去重
|
|
327
327
|
...B,
|
|
328
328
|
// 判断元素是否存在
|
|
329
|
-
...
|
|
329
|
+
...S,
|
|
330
330
|
// 数组排序
|
|
331
331
|
...x,
|
|
332
332
|
// 获取极值
|
|
333
|
-
...
|
|
333
|
+
...M,
|
|
334
334
|
// 统计出现次数
|
|
335
335
|
...b,
|
|
336
336
|
// 数组随机打乱-Fisher-Yates算法
|
|
337
337
|
...E
|
|
338
338
|
};
|
|
339
|
-
class
|
|
339
|
+
class F {
|
|
340
340
|
/** Base64 编码表 */
|
|
341
341
|
static BASE64_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
342
342
|
/**
|
|
@@ -667,7 +667,7 @@ const R = {
|
|
|
667
667
|
}
|
|
668
668
|
}, D = {
|
|
669
669
|
/**
|
|
670
|
-
*
|
|
670
|
+
* 浅拷贝,使用 for 循环实现浅拷贝
|
|
671
671
|
* @param source 需要处理的源对象
|
|
672
672
|
* @returns 浅拷贝后的新对象
|
|
673
673
|
*/
|
|
@@ -681,6 +681,22 @@ const R = {
|
|
|
681
681
|
n[t] = e[t];
|
|
682
682
|
return n;
|
|
683
683
|
},
|
|
684
|
+
/**
|
|
685
|
+
* 浅拷贝,使用 Object.assign({}, source) 实现浅拷贝
|
|
686
|
+
* @param source 需要处理的源对象
|
|
687
|
+
* @returns 浅拷贝后的新对象
|
|
688
|
+
*/
|
|
689
|
+
shallowCloneByObjectAssign(e) {
|
|
690
|
+
return Object.assign({}, e);
|
|
691
|
+
},
|
|
692
|
+
/**
|
|
693
|
+
* 浅拷贝,使用 扩展运算符 ...source 实现浅拷贝【更推荐】
|
|
694
|
+
* @param source 需要处理的源对象
|
|
695
|
+
* @returns 浅拷贝后的新对象
|
|
696
|
+
*/
|
|
697
|
+
shallowCloneBySpreadOperator(e) {
|
|
698
|
+
return { ...e };
|
|
699
|
+
},
|
|
684
700
|
/**
|
|
685
701
|
* 最便捷实现深克隆/拷贝
|
|
686
702
|
* 存在的问题:
|
|
@@ -709,7 +725,7 @@ const R = {
|
|
|
709
725
|
throw new Error("空对象不能进行深拷贝");
|
|
710
726
|
if (n.has(e))
|
|
711
727
|
return n.get(e);
|
|
712
|
-
const t =
|
|
728
|
+
const t = T.getType(e);
|
|
713
729
|
let r;
|
|
714
730
|
switch (t) {
|
|
715
731
|
case "object":
|
|
@@ -743,6 +759,55 @@ const R = {
|
|
|
743
759
|
}), r);
|
|
744
760
|
}
|
|
745
761
|
}, O = {
|
|
762
|
+
/**
|
|
763
|
+
* 函数柯里化
|
|
764
|
+
* 定义:把一个多参数的函数,转换为一系列的单参数函数,每个函数只处理一个参数。
|
|
765
|
+
* 方向:多参数函数 -> 单参数函数链
|
|
766
|
+
* 核心:参数复用、延迟执行。
|
|
767
|
+
* 实现思路:参数收集、直到参数够了,再执行函数。
|
|
768
|
+
* 例如:
|
|
769
|
+
* ```ts
|
|
770
|
+
* const add = (a: number, b: number) => a + b;
|
|
771
|
+
* const add1 = curry(add)(1);
|
|
772
|
+
* const result = add1(2); // 3
|
|
773
|
+
* console.log(result); // 正确答案 3
|
|
774
|
+
* ```
|
|
775
|
+
* @param fn 要柯里化的函数
|
|
776
|
+
* @returns 柯里化后的函数
|
|
777
|
+
*/
|
|
778
|
+
curry(e) {
|
|
779
|
+
if (typeof e != "function")
|
|
780
|
+
throw new TypeError("curry: fn must be a function, but got " + typeof e);
|
|
781
|
+
const n = e.length;
|
|
782
|
+
return function t(...r) {
|
|
783
|
+
return r.length >= n ? e.apply(this, r) : function(...o) {
|
|
784
|
+
return t.apply(this, [...r, ...o]);
|
|
785
|
+
};
|
|
786
|
+
};
|
|
787
|
+
},
|
|
788
|
+
/**
|
|
789
|
+
* 反柯里化
|
|
790
|
+
* 定义:让一个“只能被特定对象调用”的方法,变成一个“可以接受任何对象作为第一个参数”的通用函数。
|
|
791
|
+
* 方向:对象方法 -> 通用函数
|
|
792
|
+
* 核心:将对象方法转换为通用函数,允许在不同对象上调用。
|
|
793
|
+
* 实现思路:将对象方法绑定到通用函数上,返回通用函数。
|
|
794
|
+
* 例如:
|
|
795
|
+
* ```ts
|
|
796
|
+
* const push = uncurry(Array.prototype.push);
|
|
797
|
+
* const obj = {};
|
|
798
|
+
* const result = push(obj, 1, 2);
|
|
799
|
+
* console.log(result); // 正确答案 返回长度为 2
|
|
800
|
+
* console.log(obj); // 正确答案 {0: 1, 1: 2, length: 2}
|
|
801
|
+
* ```
|
|
802
|
+
* @param fn 要反柯里化的函数
|
|
803
|
+
* @returns 反柯里化后的函数
|
|
804
|
+
*/
|
|
805
|
+
uncurry(e) {
|
|
806
|
+
return function(n, ...t) {
|
|
807
|
+
return e.call(n, ...t);
|
|
808
|
+
};
|
|
809
|
+
}
|
|
810
|
+
}, U = {
|
|
746
811
|
/**
|
|
747
812
|
* 获取变量的类型
|
|
748
813
|
* @param val 任意变量
|
|
@@ -751,10 +816,11 @@ const R = {
|
|
|
751
816
|
getType(e) {
|
|
752
817
|
return Object.prototype.toString.call(e).replace(/\[object\s(\w+)\]/, "$1");
|
|
753
818
|
}
|
|
754
|
-
},
|
|
755
|
-
...
|
|
756
|
-
...D
|
|
757
|
-
|
|
819
|
+
}, T = {
|
|
820
|
+
...U,
|
|
821
|
+
...D,
|
|
822
|
+
...O
|
|
823
|
+
}, P = {
|
|
758
824
|
/**
|
|
759
825
|
* 通过传入的name获取cookie的值
|
|
760
826
|
* @param name cookie的name
|
|
@@ -784,7 +850,7 @@ const R = {
|
|
|
784
850
|
deleteCookie(e) {
|
|
785
851
|
this.setCookie(e, "", -1);
|
|
786
852
|
}
|
|
787
|
-
},
|
|
853
|
+
}, q = {
|
|
788
854
|
/**
|
|
789
855
|
* 获取当前时间字符串
|
|
790
856
|
* @param locales 区域设置。如:'zh-CN','en-US',"chinese"。默认'zh-CN'。
|
|
@@ -899,7 +965,7 @@ const R = {
|
|
|
899
965
|
new RegExp("(" + r + ")").test(n) && (n = n.replace(RegExp.$1, RegExp.$1.length === 1 ? t[r] : ("00" + t[r]).substr(("" + t[r]).length)));
|
|
900
966
|
return n;
|
|
901
967
|
}
|
|
902
|
-
},
|
|
968
|
+
}, V = {
|
|
903
969
|
/**
|
|
904
970
|
* 获取元素相对于文档顶部的偏移量(距离)
|
|
905
971
|
* 处理了SVG元素的特殊情况。
|
|
@@ -970,7 +1036,7 @@ const R = {
|
|
|
970
1036
|
getViewportHeight() {
|
|
971
1037
|
return window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
|
|
972
1038
|
}
|
|
973
|
-
},
|
|
1039
|
+
}, W = {
|
|
974
1040
|
/**
|
|
975
1041
|
* 将blob对象转化成文件并导出到本地
|
|
976
1042
|
* @param blob blob对象
|
|
@@ -989,7 +1055,7 @@ const R = {
|
|
|
989
1055
|
const t = document.createElement("a");
|
|
990
1056
|
t.href = e, t.download = n, document.body.appendChild(t), t.click(), URL.revokeObjectURL(e), document.body.removeChild(t);
|
|
991
1057
|
}
|
|
992
|
-
},
|
|
1058
|
+
}, Y = {
|
|
993
1059
|
/**
|
|
994
1060
|
* echarts动画函数
|
|
995
1061
|
* @param option echarts配置
|
|
@@ -1021,7 +1087,7 @@ const R = {
|
|
|
1021
1087
|
});
|
|
1022
1088
|
});
|
|
1023
1089
|
}
|
|
1024
|
-
},
|
|
1090
|
+
}, z = {
|
|
1025
1091
|
/**
|
|
1026
1092
|
* 将选中的字母数组从A-Z排序:用于试题选择答案的排序实例
|
|
1027
1093
|
* @param arr 字母数组
|
|
@@ -1033,7 +1099,7 @@ const R = {
|
|
|
1033
1099
|
return o < s ? -1 : o > s ? 1 : 0;
|
|
1034
1100
|
}) : void 0;
|
|
1035
1101
|
}
|
|
1036
|
-
},
|
|
1102
|
+
}, J = {
|
|
1037
1103
|
/**
|
|
1038
1104
|
* 角度(度数)转弧度
|
|
1039
1105
|
* 在数学和编程里,角度有两种常用单位,分别是度(°)和弧度(rad)。
|
|
@@ -1119,7 +1185,7 @@ const R = {
|
|
|
1119
1185
|
return { segments: r, total: o };
|
|
1120
1186
|
}
|
|
1121
1187
|
};
|
|
1122
|
-
class
|
|
1188
|
+
class Z {
|
|
1123
1189
|
/**
|
|
1124
1190
|
* 转换为标准金额格式(带千分位和两位小数)
|
|
1125
1191
|
* @param num 要转换的数字
|
|
@@ -1174,7 +1240,7 @@ class J {
|
|
|
1174
1240
|
}
|
|
1175
1241
|
}
|
|
1176
1242
|
}
|
|
1177
|
-
const
|
|
1243
|
+
const K = {
|
|
1178
1244
|
/**
|
|
1179
1245
|
* 中文姓名脱敏
|
|
1180
1246
|
* @param name 姓名
|
|
@@ -1217,15 +1283,15 @@ const Z = {
|
|
|
1217
1283
|
}
|
|
1218
1284
|
return `${e.slice(0, c)}${"*".repeat(e.length - c)}`;
|
|
1219
1285
|
}
|
|
1220
|
-
}, v = (e) => e > 25 || e < 0 ? "" : "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[e],
|
|
1286
|
+
}, v = (e) => e > 25 || e < 0 ? "" : "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[e], j = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
1221
1287
|
__proto__: null,
|
|
1222
1288
|
toLetter: v
|
|
1223
|
-
}, Symbol.toStringTag, { value: "Module" })),
|
|
1289
|
+
}, Symbol.toStringTag, { value: "Module" })), L = (e) => e.toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","), I = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
1224
1290
|
__proto__: null,
|
|
1225
|
-
toMoney:
|
|
1226
|
-
}, Symbol.toStringTag, { value: "Module" })),
|
|
1227
|
-
...
|
|
1228
|
-
...
|
|
1291
|
+
toMoney: L
|
|
1292
|
+
}, Symbol.toStringTag, { value: "Module" })), X = {
|
|
1293
|
+
...j,
|
|
1294
|
+
...I,
|
|
1229
1295
|
/**
|
|
1230
1296
|
* 判断是否为数字
|
|
1231
1297
|
* @param val 待判断的值
|
|
@@ -1234,7 +1300,7 @@ const Z = {
|
|
|
1234
1300
|
isNumber(e) {
|
|
1235
1301
|
return typeof e == "number" && !isNaN(e);
|
|
1236
1302
|
}
|
|
1237
|
-
},
|
|
1303
|
+
}, G = {
|
|
1238
1304
|
/**
|
|
1239
1305
|
* 脱敏
|
|
1240
1306
|
* @param phone 电话号码/手机号码
|
|
@@ -1243,7 +1309,7 @@ const Z = {
|
|
|
1243
1309
|
desensitize(e) {
|
|
1244
1310
|
return e ? e.replace(/^(\d{3})\d{4}(\d{4})$/, "$1****$2") || e.slice(0, 3) + "****" + e.slice(7) : "";
|
|
1245
1311
|
}
|
|
1246
|
-
},
|
|
1312
|
+
}, Q = {
|
|
1247
1313
|
/**
|
|
1248
1314
|
* 生成随机颜色
|
|
1249
1315
|
* @returns 随机颜色值
|
|
@@ -1267,7 +1333,7 @@ const Z = {
|
|
|
1267
1333
|
uniqueId() {
|
|
1268
1334
|
return Date.now().toString(36) + Math.random().toString(36).substr(2, 5);
|
|
1269
1335
|
}
|
|
1270
|
-
},
|
|
1336
|
+
}, ee = {
|
|
1271
1337
|
/**
|
|
1272
1338
|
* 验证手机号
|
|
1273
1339
|
*/
|
|
@@ -1304,7 +1370,7 @@ const Z = {
|
|
|
1304
1370
|
* 验证0.01~0.99正则:最多两位小数。0.1、0.10、0.9、0.90
|
|
1305
1371
|
*/
|
|
1306
1372
|
decimal: /^0\.(0[1-9]|[1-9][0-9]*)$/
|
|
1307
|
-
},
|
|
1373
|
+
}, te = {
|
|
1308
1374
|
/**
|
|
1309
1375
|
* 通过key值获取 localStorage 中存储的某个值
|
|
1310
1376
|
* @param key 获取的key
|
|
@@ -1351,7 +1417,7 @@ const Z = {
|
|
|
1351
1417
|
removeSession(e) {
|
|
1352
1418
|
sessionStorage.removeItem(e);
|
|
1353
1419
|
}
|
|
1354
|
-
},
|
|
1420
|
+
}, ne = {
|
|
1355
1421
|
/**
|
|
1356
1422
|
* 判断某元素是否在字符串中-比includes()方法更兼容,includes为ES6新增方法,IE不支持。小程序也不支持
|
|
1357
1423
|
* @param str 字符串
|
|
@@ -1434,19 +1500,19 @@ const Z = {
|
|
|
1434
1500
|
throw new Error("开始位置小于0或结束位置超出字符串长度或开始位置大于结束位置");
|
|
1435
1501
|
return e.slice(0, n) + "*".repeat(t - n + 1) + e.slice(t);
|
|
1436
1502
|
}
|
|
1437
|
-
},
|
|
1503
|
+
}, _ = (e) => {
|
|
1438
1504
|
const t = new RegExp("[?&]" + e + "=([^&#]*)", "gi").exec(window.location.href);
|
|
1439
1505
|
return t ? decodeURIComponent(t[1]) : null;
|
|
1440
1506
|
};
|
|
1441
|
-
function
|
|
1507
|
+
function H(e) {
|
|
1442
1508
|
return new URLSearchParams(window.location.search).get(e);
|
|
1443
1509
|
}
|
|
1444
|
-
const
|
|
1510
|
+
const $ = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
1445
1511
|
__proto__: null,
|
|
1446
|
-
getQueryInfoByName:
|
|
1447
|
-
getQueryParam:
|
|
1448
|
-
}, Symbol.toStringTag, { value: "Module" })),
|
|
1449
|
-
|
|
1512
|
+
getQueryInfoByName: _,
|
|
1513
|
+
getQueryParam: H
|
|
1514
|
+
}, Symbol.toStringTag, { value: "Module" })), re = {
|
|
1515
|
+
...$,
|
|
1450
1516
|
/**
|
|
1451
1517
|
* 获取当前域名
|
|
1452
1518
|
* @returns 当前url链接的host信息
|
|
@@ -1461,7 +1527,7 @@ const H = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
|
1461
1527
|
getPath() {
|
|
1462
1528
|
return window.location.pathname;
|
|
1463
1529
|
}
|
|
1464
|
-
},
|
|
1530
|
+
}, oe = {
|
|
1465
1531
|
/**
|
|
1466
1532
|
* 处理瀑布流数据,使其竖向瀑布流布局呈现横向瀑布流的展现形式。适用于 column-gap: 20rpx; column-count: 2; 布局的瀑布流
|
|
1467
1533
|
* @param list 瀑布流数据-数组
|
|
@@ -1499,26 +1565,26 @@ const H = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
|
1499
1565
|
}
|
|
1500
1566
|
};
|
|
1501
1567
|
export {
|
|
1502
|
-
|
|
1503
|
-
|
|
1568
|
+
F as Base64Utils,
|
|
1569
|
+
Z as MoneyFormatter,
|
|
1504
1570
|
C as arrayUtils,
|
|
1505
1571
|
R as booleanUtils,
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1572
|
+
T as commonUtils,
|
|
1573
|
+
P as cookieUtils,
|
|
1574
|
+
q as dateUtils,
|
|
1575
|
+
V as documentUtils,
|
|
1576
|
+
W as downloadUtils,
|
|
1577
|
+
Y as echartsUtils,
|
|
1578
|
+
z as letterUtils,
|
|
1579
|
+
J as mapUtils,
|
|
1580
|
+
K as nameUtils,
|
|
1581
|
+
X as numberUtils,
|
|
1516
1582
|
m as objectUtils,
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1583
|
+
G as phoneUtils,
|
|
1584
|
+
Q as randomUtils,
|
|
1585
|
+
ee as regexpUtils,
|
|
1586
|
+
te as storageUtils,
|
|
1587
|
+
ne as stringUtils,
|
|
1588
|
+
re as urlUtils,
|
|
1589
|
+
oe as waterfallUtils
|
|
1524
1590
|
};
|
package/dist/utils.umd.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
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"})});
|
|
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(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))+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,"/"),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),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,"/"),c="=".repeat((4-s.length%4)%4),l=s+c,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 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,d=i&63;s?l?t+=this.BASE64_CHARS.charAt(h)+this.BASE64_CHARS.charAt(a)+this.BASE64_CHARS.charAt(u)+this.BASE64_CHARS.charAt(d):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,d=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,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},shallowCloneByObjectAssign(e){return Object.assign({},e)},shallowCloneBySpreadOperator(e){return{...e}},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)}},...{curry(e){if(typeof e!="function")throw new TypeError("curry: fn must be a function, but got "+typeof e);const n=e.length;return function t(...r){return r.length>=n?e.apply(this,r):function(...o){return t.apply(this,[...r,...o])}}},uncurry(e){return function(n,...t){return e.call(n,...t)}}}},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,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 A=new Date;if(A.setDate(A.getDate()-2),i===p.getMonth()+1&&h===p.getDate())a="昨天"+u;else if(i===A.getMonth()+1&&h===A.getDate())a="前天"+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]="星期六",a=w[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}},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}},O={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)}},R={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})})}},D={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),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),d=r.degrees2Radians(c-o),y=Math.sin(u/2)*Math.sin(u/2)+Math.cos(h)*Math.cos(a)*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 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 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),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 d="";if(c>0){const g=Math.floor(c/10),p=c%10;g>0&&(d+=l[g]+h[0]),p>0&&(d+=l[p]+h[1])}else d="整";let y=(r?"负":"")+a+"圆"+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 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={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 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)}},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()),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:d}=M.getMinValueAndIndex(l);a.style.left=(o+c)*u+"px",a.style.top=d+t+"px",l[u]=a.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=O,f.echartsUtils=R,f.letterUtils=D,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
package/types/common/clone.d.ts
CHANGED
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
declare const _default: {
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* 浅拷贝,使用 for 循环实现浅拷贝
|
|
4
4
|
* @param source 需要处理的源对象
|
|
5
5
|
* @returns 浅拷贝后的新对象
|
|
6
6
|
*/
|
|
7
7
|
shallowClone(source: object): object;
|
|
8
|
+
/**
|
|
9
|
+
* 浅拷贝,使用 Object.assign({}, source) 实现浅拷贝
|
|
10
|
+
* @param source 需要处理的源对象
|
|
11
|
+
* @returns 浅拷贝后的新对象
|
|
12
|
+
*/
|
|
13
|
+
shallowCloneByObjectAssign(source: object): object;
|
|
14
|
+
/**
|
|
15
|
+
* 浅拷贝,使用 扩展运算符 ...source 实现浅拷贝【更推荐】
|
|
16
|
+
* @param source 需要处理的源对象
|
|
17
|
+
* @returns 浅拷贝后的新对象
|
|
18
|
+
*/
|
|
19
|
+
shallowCloneBySpreadOperator(source: object): {};
|
|
8
20
|
/**
|
|
9
21
|
* 最便捷实现深克隆/拷贝
|
|
10
22
|
* 存在的问题:
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
declare const _default: {
|
|
2
|
+
/**
|
|
3
|
+
* 函数柯里化
|
|
4
|
+
* 定义:把一个多参数的函数,转换为一系列的单参数函数,每个函数只处理一个参数。
|
|
5
|
+
* 方向:多参数函数 -> 单参数函数链
|
|
6
|
+
* 核心:参数复用、延迟执行。
|
|
7
|
+
* 实现思路:参数收集、直到参数够了,再执行函数。
|
|
8
|
+
* 例如:
|
|
9
|
+
* ```ts
|
|
10
|
+
* const add = (a: number, b: number) => a + b;
|
|
11
|
+
* const add1 = curry(add)(1);
|
|
12
|
+
* const result = add1(2); // 3
|
|
13
|
+
* console.log(result); // 正确答案 3
|
|
14
|
+
* ```
|
|
15
|
+
* @param fn 要柯里化的函数
|
|
16
|
+
* @returns 柯里化后的函数
|
|
17
|
+
*/
|
|
18
|
+
curry(fn: Function): (this: unknown, ...args: unknown[]) => any;
|
|
19
|
+
/**
|
|
20
|
+
* 反柯里化
|
|
21
|
+
* 定义:让一个“只能被特定对象调用”的方法,变成一个“可以接受任何对象作为第一个参数”的通用函数。
|
|
22
|
+
* 方向:对象方法 -> 通用函数
|
|
23
|
+
* 核心:将对象方法转换为通用函数,允许在不同对象上调用。
|
|
24
|
+
* 实现思路:将对象方法绑定到通用函数上,返回通用函数。
|
|
25
|
+
* 例如:
|
|
26
|
+
* ```ts
|
|
27
|
+
* const push = uncurry(Array.prototype.push);
|
|
28
|
+
* const obj = {};
|
|
29
|
+
* const result = push(obj, 1, 2);
|
|
30
|
+
* console.log(result); // 正确答案 返回长度为 2
|
|
31
|
+
* console.log(obj); // 正确答案 {0: 1, 1: 2, length: 2}
|
|
32
|
+
* ```
|
|
33
|
+
* @param fn 要反柯里化的函数
|
|
34
|
+
* @returns 反柯里化后的函数
|
|
35
|
+
*/
|
|
36
|
+
uncurry(fn: Function): (context: unknown, ...args: unknown[]) => any;
|
|
37
|
+
};
|
|
38
|
+
export default _default;
|
package/types/common/index.d.ts
CHANGED
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
* 通用工具函数
|
|
3
3
|
*/
|
|
4
4
|
export declare const commonUtils: {
|
|
5
|
+
readonly curry: (fn: Function) => (this: unknown, ...args: unknown[]) => any;
|
|
6
|
+
readonly uncurry: (fn: Function) => (context: unknown, ...args: unknown[]) => any;
|
|
5
7
|
readonly shallowClone: (source: object) => object;
|
|
8
|
+
readonly shallowCloneByObjectAssign: (source: object) => object;
|
|
9
|
+
readonly shallowCloneBySpreadOperator: (source: object) => {};
|
|
6
10
|
readonly deepCloneByJSON: (source: unknown) => any;
|
|
7
11
|
readonly deepCloneByMap: <T>(source: T, map?: WeakMap<object, unknown>) => unknown;
|
|
8
12
|
readonly getType: (val: unknown) => string;
|