@yh-kit/utils 1.6.0 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/utils.js +417 -275
- package/dist/utils.umd.cjs +1 -1
- package/package.json +1 -1
- package/types/utils/lib/array/index.d.ts +18 -0
- package/types/utils/lib/document/index.d.ts +1 -1
- package/types/utils/lib/index.d.ts +1 -0
- package/types/utils/lib/map/index.d.ts +59 -4
- package/types/utils/lib/regex/index.d.ts +41 -0
- package/types/utils/lib/waterfall/index.d.ts +2 -1
package/dist/utils.js
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
const
|
|
2
|
-
if (!
|
|
3
|
-
const
|
|
4
|
-
return
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
}),
|
|
8
|
-
},
|
|
1
|
+
const m = (e) => {
|
|
2
|
+
if (!e || !e.length) return {};
|
|
3
|
+
const n = {};
|
|
4
|
+
return e.forEach((t) => {
|
|
5
|
+
const r = Object.assign({ label: t.label, text: t.label }, t);
|
|
6
|
+
n[t == null ? void 0 : t.value] = r;
|
|
7
|
+
}), n;
|
|
8
|
+
}, b = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
9
9
|
__proto__: null,
|
|
10
|
-
toEnumObj:
|
|
11
|
-
}, Symbol.toStringTag, { value: "Module" })),
|
|
10
|
+
toEnumObj: m
|
|
11
|
+
}, Symbol.toStringTag, { value: "Module" })), y = Object.assign(
|
|
12
12
|
{
|
|
13
13
|
/**
|
|
14
14
|
* 数组去重
|
|
15
15
|
* @param arr 数组
|
|
16
16
|
* @returns 去重后的数组
|
|
17
17
|
*/
|
|
18
|
-
unique(
|
|
19
|
-
return
|
|
18
|
+
unique(e) {
|
|
19
|
+
return e ? Array.from(new Set(e)) : [];
|
|
20
20
|
},
|
|
21
21
|
/**
|
|
22
22
|
* 判断某元素是否在数组中
|
|
@@ -24,8 +24,8 @@ const b = (t) => {
|
|
|
24
24
|
* @param element 查询元素
|
|
25
25
|
* @returns 是否存在。true 存在;false 不存在
|
|
26
26
|
*/
|
|
27
|
-
isExist(
|
|
28
|
-
return !
|
|
27
|
+
isExist(e, n) {
|
|
28
|
+
return !e || !n ? !1 : e.indexOf(n) !== -1;
|
|
29
29
|
},
|
|
30
30
|
/**
|
|
31
31
|
* 统计数组中某元素出现的次数:对于大型数组,手动循环的性能略优于 filter 和 reduce。
|
|
@@ -33,11 +33,11 @@ const b = (t) => {
|
|
|
33
33
|
* @param target 目标元素
|
|
34
34
|
* @returns 出现次数
|
|
35
35
|
*/
|
|
36
|
-
countOfAppear(
|
|
37
|
-
let
|
|
38
|
-
for (const
|
|
39
|
-
|
|
40
|
-
return
|
|
36
|
+
countOfAppear(e, n) {
|
|
37
|
+
let t = 0;
|
|
38
|
+
for (const r of e)
|
|
39
|
+
r === n && t++;
|
|
40
|
+
return t;
|
|
41
41
|
},
|
|
42
42
|
/**
|
|
43
43
|
* 查找某个元素在数组中重复出现的位置
|
|
@@ -45,13 +45,13 @@ const b = (t) => {
|
|
|
45
45
|
* @param element 元素
|
|
46
46
|
* @returns 位置数组
|
|
47
47
|
*/
|
|
48
|
-
indexsOfAppear(
|
|
49
|
-
let
|
|
50
|
-
const
|
|
48
|
+
indexsOfAppear(e, n) {
|
|
49
|
+
let t = -1;
|
|
50
|
+
const r = [];
|
|
51
51
|
do
|
|
52
|
-
|
|
53
|
-
while (
|
|
54
|
-
return
|
|
52
|
+
t = e.indexOf(n, t + 1), t !== -1 && r.push(t);
|
|
53
|
+
while (t !== -1);
|
|
54
|
+
return r;
|
|
55
55
|
},
|
|
56
56
|
/**
|
|
57
57
|
* 数组排序-默认升序
|
|
@@ -59,8 +59,8 @@ const b = (t) => {
|
|
|
59
59
|
* @param order 排序方式:asc 升序;desc 降序
|
|
60
60
|
* @returns 排序后的数组
|
|
61
61
|
*/
|
|
62
|
-
sort(
|
|
63
|
-
return
|
|
62
|
+
sort(e, n = "asc") {
|
|
63
|
+
return e ? e.sort((t, r) => n === "asc" ? t > r ? 1 : -1 : t < r ? 1 : -1) : [];
|
|
64
64
|
},
|
|
65
65
|
/**
|
|
66
66
|
* 数组乱序(洗牌算法)
|
|
@@ -73,34 +73,70 @@ const b = (t) => {
|
|
|
73
73
|
* @param arr 数组
|
|
74
74
|
* @returns
|
|
75
75
|
*/
|
|
76
|
-
shuffle(
|
|
77
|
-
if (!
|
|
76
|
+
shuffle(e) {
|
|
77
|
+
if (!e)
|
|
78
78
|
return [];
|
|
79
|
-
for (let
|
|
80
|
-
const
|
|
81
|
-
[
|
|
79
|
+
for (let n = e.length - 1; n > 0; n--) {
|
|
80
|
+
const t = Math.floor(Math.random() * (n + 1));
|
|
81
|
+
[e[n], e[t]] = [e[t], e[n]];
|
|
82
82
|
}
|
|
83
|
-
return
|
|
83
|
+
return e;
|
|
84
84
|
},
|
|
85
85
|
/**
|
|
86
86
|
* 获取数组中的最大值
|
|
87
87
|
* @param arr 数组
|
|
88
88
|
* @returns 最大值
|
|
89
89
|
*/
|
|
90
|
-
getMaxValue(
|
|
91
|
-
return
|
|
90
|
+
getMaxValue(e) {
|
|
91
|
+
return e ? Math.max(...e) : 0;
|
|
92
92
|
},
|
|
93
93
|
/**
|
|
94
94
|
* 获取数组中的最小值
|
|
95
95
|
* @param arr 数组
|
|
96
96
|
* @returns 最小值
|
|
97
97
|
*/
|
|
98
|
-
getMinValue(
|
|
99
|
-
return
|
|
98
|
+
getMinValue(e) {
|
|
99
|
+
return e ? Math.min(...e) : 0;
|
|
100
|
+
},
|
|
101
|
+
/**
|
|
102
|
+
* 获取数组中的最小值和索引
|
|
103
|
+
* @param array 数组
|
|
104
|
+
* @returns 最小值和索引
|
|
105
|
+
*/
|
|
106
|
+
getMinValueAndIndex(e) {
|
|
107
|
+
if (e.length === 0) return { minV: 0, minI: 0 };
|
|
108
|
+
const n = {
|
|
109
|
+
/** 最小值 */
|
|
110
|
+
minV: e[0],
|
|
111
|
+
/** 最小值索引 */
|
|
112
|
+
minI: 0
|
|
113
|
+
};
|
|
114
|
+
for (let t = 1, r = e.length; t < r; t++) {
|
|
115
|
+
const o = e[t];
|
|
116
|
+
n.minV > o && (n.minV = o, n.minI = t);
|
|
117
|
+
}
|
|
118
|
+
return n;
|
|
119
|
+
},
|
|
120
|
+
/**
|
|
121
|
+
* 获取数组中的最大值和索引
|
|
122
|
+
* @param array 数组
|
|
123
|
+
* @returns 最大值和索引
|
|
124
|
+
*/
|
|
125
|
+
getMaxValueAndIndex(e) {
|
|
126
|
+
if (e.length === 0) return { maxV: 0, maxI: 0 };
|
|
127
|
+
const n = {
|
|
128
|
+
maxV: e[0],
|
|
129
|
+
maxI: 0
|
|
130
|
+
};
|
|
131
|
+
for (let t = 1, r = e.length; t < r; t++) {
|
|
132
|
+
const o = e[t];
|
|
133
|
+
n.maxV < o && (n.maxV = o, n.maxI = t);
|
|
134
|
+
}
|
|
135
|
+
return n;
|
|
100
136
|
}
|
|
101
137
|
},
|
|
102
138
|
{
|
|
103
|
-
...
|
|
139
|
+
...b
|
|
104
140
|
}
|
|
105
141
|
), L = {
|
|
106
142
|
/**
|
|
@@ -112,18 +148,18 @@ const b = (t) => {
|
|
|
112
148
|
* @param sliceSize 可选参数,表示分片大小,默认为512字节。用于控制每次处理的Base64字符串长度,以优化大文件的处理。
|
|
113
149
|
* @returns 返回转换后的Blob对象,如果转换失败,则返回null。
|
|
114
150
|
*/
|
|
115
|
-
toBlob(
|
|
116
|
-
const
|
|
151
|
+
toBlob(e, n = "", t = 512) {
|
|
152
|
+
const o = (e.split(",")[1] || e).replace(/-/g, "+").replace(/_/g, "/"), s = "=".repeat((4 - o.length % 4) % 4), l = o + s;
|
|
117
153
|
try {
|
|
118
154
|
const c = atob(l), a = [];
|
|
119
|
-
for (let
|
|
120
|
-
const i = c.slice(
|
|
121
|
-
for (let
|
|
122
|
-
|
|
123
|
-
const
|
|
124
|
-
a.push(
|
|
155
|
+
for (let g = 0; g < c.length; g += t) {
|
|
156
|
+
const i = c.slice(g, g + t), u = new Array(i.length);
|
|
157
|
+
for (let d = 0; d < i.length; d++)
|
|
158
|
+
u[d] = i.charCodeAt(d);
|
|
159
|
+
const f = new Uint8Array(u);
|
|
160
|
+
a.push(f);
|
|
125
161
|
}
|
|
126
|
-
return new Blob(a, { type:
|
|
162
|
+
return new Blob(a, { type: n });
|
|
127
163
|
} catch (c) {
|
|
128
164
|
return console.error("Failed to convert base64 to blob:", c), null;
|
|
129
165
|
}
|
|
@@ -138,73 +174,73 @@ const b = (t) => {
|
|
|
138
174
|
* @param mimeType MIME类型,默认为"text/plain"。
|
|
139
175
|
* @returns 返回一个File对象,包含解码后的数据。
|
|
140
176
|
*/
|
|
141
|
-
toFile(
|
|
142
|
-
const
|
|
177
|
+
toFile(e, n = "file.txt", t = "text/plain") {
|
|
178
|
+
const o = e.replace(/^data:.+;base64,/, "").replace(/-/g, "+").replace(/_/g, "/"), s = "=".repeat((4 - o.length % 4) % 4), l = o + s, c = atob(l), a = [];
|
|
143
179
|
for (let i = 0; i < c.length; i += 512) {
|
|
144
|
-
const
|
|
145
|
-
for (let
|
|
146
|
-
|
|
147
|
-
a.push(new Uint8Array(
|
|
180
|
+
const u = c.slice(i, i + 512), f = new Array(u.length);
|
|
181
|
+
for (let d = 0; d < u.length; d++)
|
|
182
|
+
f[d] = u.charCodeAt(d);
|
|
183
|
+
a.push(new Uint8Array(f));
|
|
148
184
|
}
|
|
149
|
-
const
|
|
150
|
-
return new File([
|
|
185
|
+
const g = new Blob(a, { type: t });
|
|
186
|
+
return new File([g], n, { type: t });
|
|
151
187
|
}
|
|
152
|
-
},
|
|
188
|
+
}, w = {
|
|
153
189
|
/**
|
|
154
190
|
* 检查是否为空字符串
|
|
155
191
|
* @param str 要检查的字符串
|
|
156
192
|
* @returns 如果字符串为空,则返回 true,否则返回 false
|
|
157
193
|
*/
|
|
158
|
-
isEmptyString(
|
|
159
|
-
return typeof
|
|
194
|
+
isEmptyString(e) {
|
|
195
|
+
return typeof e == "string" && e.trim() === "";
|
|
160
196
|
},
|
|
161
197
|
/**
|
|
162
198
|
* 判断是否为数字
|
|
163
199
|
* @param val 要检查的值
|
|
164
200
|
* @returns 如果值是数字,则返回 true,否则返回 false
|
|
165
201
|
*/
|
|
166
|
-
isNumber(
|
|
167
|
-
return typeof
|
|
202
|
+
isNumber(e) {
|
|
203
|
+
return typeof e == "number" && !isNaN(e);
|
|
168
204
|
},
|
|
169
205
|
/**
|
|
170
206
|
* 判断是否为对象
|
|
171
207
|
* @param val 要检查的值
|
|
172
208
|
* @returns 如果值是对象,则返回 true,否则返回 false
|
|
173
209
|
*/
|
|
174
|
-
isObject(
|
|
175
|
-
return
|
|
210
|
+
isObject(e) {
|
|
211
|
+
return e !== null && typeof e == "object" && !Array.isArray(e);
|
|
176
212
|
},
|
|
177
213
|
/**
|
|
178
214
|
* 判断对象是否为空
|
|
179
215
|
* @param obj 要检查的对象
|
|
180
216
|
* @returns 如果对象为空,则返回 true,否则返回 false
|
|
181
217
|
*/
|
|
182
|
-
isEmptyObject(
|
|
183
|
-
return
|
|
218
|
+
isEmptyObject(e) {
|
|
219
|
+
return e ? Object.keys(e).length === 0 && e.constructor === Object : !0;
|
|
184
220
|
},
|
|
185
221
|
/**
|
|
186
222
|
* 判断是否为布尔值
|
|
187
223
|
* @param val 要检查的值
|
|
188
224
|
* @returns 如果值是布尔值,则返回 true,否则返回 false
|
|
189
225
|
*/
|
|
190
|
-
isBoolean(
|
|
191
|
-
return typeof
|
|
226
|
+
isBoolean(e) {
|
|
227
|
+
return typeof e == "boolean";
|
|
192
228
|
},
|
|
193
229
|
/**
|
|
194
230
|
* 判断是否为数组
|
|
195
231
|
* @param val 要检查的值
|
|
196
232
|
* @returns 如果值是数组,则返回 true,否则返回 false
|
|
197
233
|
*/
|
|
198
|
-
isArray(
|
|
199
|
-
return Array.isArray(
|
|
234
|
+
isArray(e) {
|
|
235
|
+
return Array.isArray(e);
|
|
200
236
|
},
|
|
201
237
|
/**
|
|
202
238
|
* 判断是否为函数
|
|
203
239
|
* @param val 要检查的值
|
|
204
240
|
* @returns
|
|
205
241
|
*/
|
|
206
|
-
isFunction(
|
|
207
|
-
return typeof
|
|
242
|
+
isFunction(e) {
|
|
243
|
+
return typeof e == "function";
|
|
208
244
|
},
|
|
209
245
|
/**
|
|
210
246
|
* 判断是否为 Promise 对象
|
|
@@ -212,41 +248,41 @@ const b = (t) => {
|
|
|
212
248
|
* @returns 如果对象是 Promise 对象,则返回 true,否则返回 false
|
|
213
249
|
*/
|
|
214
250
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
215
|
-
isPromise(
|
|
216
|
-
return !!
|
|
251
|
+
isPromise(e) {
|
|
252
|
+
return !!e && (typeof e == "object" || typeof e == "function") && typeof e.then == "function";
|
|
217
253
|
},
|
|
218
254
|
/**
|
|
219
255
|
* 判断是否为 DOM 元素
|
|
220
256
|
* @param obj 要检查的对象
|
|
221
257
|
* @returns 如果对象是 DOM 元素,则返回 true,否则返回 false
|
|
222
258
|
*/
|
|
223
|
-
isElement(
|
|
224
|
-
return
|
|
259
|
+
isElement(e) {
|
|
260
|
+
return e instanceof Element;
|
|
225
261
|
},
|
|
226
262
|
/**
|
|
227
263
|
* 判断手机号格式(中国)
|
|
228
264
|
* @param str 手机号字符串
|
|
229
265
|
* @returns true 表示手机号格式正确,false 表示手机号格式错误
|
|
230
266
|
*/
|
|
231
|
-
isPhone(
|
|
232
|
-
return /^1[3-9]\d{9}$/.test(
|
|
267
|
+
isPhone(e) {
|
|
268
|
+
return /^1[3-9]\d{9}$/.test(e);
|
|
233
269
|
},
|
|
234
270
|
/**
|
|
235
271
|
* 判断邮箱格式
|
|
236
272
|
* @param str 邮箱字符串
|
|
237
273
|
* @returns true 表示邮箱格式正确,false 表示邮箱格式错误
|
|
238
274
|
*/
|
|
239
|
-
isEmail(
|
|
240
|
-
return /^[\w.-]+@[\w.-]+\.\w+$/.test(
|
|
275
|
+
isEmail(e) {
|
|
276
|
+
return /^[\w.-]+@[\w.-]+\.\w+$/.test(e);
|
|
241
277
|
},
|
|
242
278
|
/**
|
|
243
279
|
* 判断字符串是否为 JSON
|
|
244
280
|
* @param str 字符串
|
|
245
281
|
* @returns true 表示是 JSON,false 表示不是 JSON
|
|
246
282
|
*/
|
|
247
|
-
isJSON(
|
|
283
|
+
isJSON(e) {
|
|
248
284
|
try {
|
|
249
|
-
return JSON.parse(
|
|
285
|
+
return JSON.parse(e), !0;
|
|
250
286
|
} catch {
|
|
251
287
|
return !1;
|
|
252
288
|
}
|
|
@@ -259,17 +295,17 @@ const b = (t) => {
|
|
|
259
295
|
* const img = new Image();
|
|
260
296
|
* img.src = "URL_ADDRESS * img.src = "https://example.com/image.jpg";
|
|
261
297
|
*/
|
|
262
|
-
isImageLoaded(
|
|
263
|
-
return
|
|
298
|
+
isImageLoaded(e) {
|
|
299
|
+
return e.complete && e.naturalWidth !== 0;
|
|
264
300
|
},
|
|
265
301
|
/**
|
|
266
302
|
* 判断元素是否在可视区域内
|
|
267
303
|
* @param el 元素对象
|
|
268
304
|
* @returns true 表示元素在可视区域内,false 表示元素不在可视区域内
|
|
269
305
|
*/
|
|
270
|
-
isInViewport(
|
|
271
|
-
const
|
|
272
|
-
return
|
|
306
|
+
isInViewport(e) {
|
|
307
|
+
const n = e.getBoundingClientRect();
|
|
308
|
+
return n.top >= 0 && n.left >= 0 && n.bottom <= window.innerHeight && n.right <= window.innerWidth;
|
|
273
309
|
},
|
|
274
310
|
/**
|
|
275
311
|
* 判断是否为闰年
|
|
@@ -283,8 +319,8 @@ const b = (t) => {
|
|
|
283
319
|
* isLeapYear(2025); // false
|
|
284
320
|
* isLeapYear(2024); // true
|
|
285
321
|
*/
|
|
286
|
-
isLeapYear(
|
|
287
|
-
return
|
|
322
|
+
isLeapYear(e) {
|
|
323
|
+
return e % 4 === 0 && e % 100 !== 0 || e % 400 === 0;
|
|
288
324
|
},
|
|
289
325
|
/**
|
|
290
326
|
* 判断是否为移动端
|
|
@@ -293,16 +329,16 @@ const b = (t) => {
|
|
|
293
329
|
isMobile() {
|
|
294
330
|
return /Mobi|Android|iPhone/i.test(navigator.userAgent);
|
|
295
331
|
}
|
|
296
|
-
},
|
|
332
|
+
}, I = {
|
|
297
333
|
/**
|
|
298
334
|
* 通过传入的name获取cookie的值
|
|
299
335
|
* @param name cookie的name
|
|
300
336
|
* @returns cookie的值
|
|
301
337
|
*/
|
|
302
|
-
getCookie(
|
|
303
|
-
if (!
|
|
304
|
-
const
|
|
305
|
-
return
|
|
338
|
+
getCookie(e) {
|
|
339
|
+
if (!e) return;
|
|
340
|
+
const n = document.cookie.match(new RegExp("(^| )" + e + "=([^;]+)"));
|
|
341
|
+
return n ? decodeURIComponent(n[2]) : null;
|
|
306
342
|
},
|
|
307
343
|
/**
|
|
308
344
|
* 设置 cookie
|
|
@@ -311,27 +347,27 @@ const b = (t) => {
|
|
|
311
347
|
* @param days cookie的过期时间,默认7天。如果为0,则表示cookie在会话结束时过期。如果为负数,则表示cookie已过期。
|
|
312
348
|
* @returns void
|
|
313
349
|
*/
|
|
314
|
-
setCookie(
|
|
315
|
-
const
|
|
316
|
-
|
|
350
|
+
setCookie(e, n, t = 7) {
|
|
351
|
+
const r = /* @__PURE__ */ new Date();
|
|
352
|
+
r.setTime(r.getTime() + t * 24 * 60 * 60 * 1e3), document.cookie = `${e}=${encodeURIComponent(n)};expires=${r.toUTCString()};path=/`;
|
|
317
353
|
},
|
|
318
354
|
/**
|
|
319
355
|
* 删除cookie
|
|
320
356
|
* @param name cookie的name
|
|
321
357
|
* @returns void
|
|
322
358
|
*/
|
|
323
|
-
deleteCookie(
|
|
324
|
-
this.setCookie(
|
|
359
|
+
deleteCookie(e) {
|
|
360
|
+
this.setCookie(e, "", -1);
|
|
325
361
|
}
|
|
326
|
-
},
|
|
362
|
+
}, j = {
|
|
327
363
|
/**
|
|
328
364
|
* 获取当前时间字符串
|
|
329
365
|
* @param locales 区域设置。如:'zh-CN','en-US',"chinese"。默认'zh-CN'。
|
|
330
366
|
* @param hour12 是否使用12小时制。默认false,使用24小时制。
|
|
331
367
|
* @returns 当前时间的字符串。如:'2025/5/27 16:54:45'
|
|
332
368
|
*/
|
|
333
|
-
getTimeString(
|
|
334
|
-
return
|
|
369
|
+
getTimeString(e, n = !1) {
|
|
370
|
+
return n ? (/* @__PURE__ */ new Date()).toLocaleString(e, { hour12: !0 }) : (/* @__PURE__ */ new Date()).toLocaleString("chinese", { hour12: !1 });
|
|
335
371
|
},
|
|
336
372
|
/**
|
|
337
373
|
* 计算两个日期相差天数
|
|
@@ -339,9 +375,9 @@ const b = (t) => {
|
|
|
339
375
|
* @param date2 日期2
|
|
340
376
|
* @returns 相差天数
|
|
341
377
|
*/
|
|
342
|
-
diffDays(
|
|
343
|
-
const
|
|
344
|
-
return
|
|
378
|
+
diffDays(e, n) {
|
|
379
|
+
const t = new Date(e).getTime(), r = new Date(n).getTime();
|
|
380
|
+
return t > r ? Math.abs(Math.floor((t - r) / (24 * 3600 * 1e3))) : Math.abs(Math.floor((r - t) / (24 * 3600 * 1e3)));
|
|
345
381
|
},
|
|
346
382
|
/**
|
|
347
383
|
* 生成唯一ID(时间戳+随机数)
|
|
@@ -357,10 +393,10 @@ const b = (t) => {
|
|
|
357
393
|
* @param day 日期
|
|
358
394
|
* @returns 当年的第几天
|
|
359
395
|
*/
|
|
360
|
-
getWhichDays(
|
|
361
|
-
let
|
|
362
|
-
for (let
|
|
363
|
-
switch (
|
|
396
|
+
getWhichDays(e, n, t) {
|
|
397
|
+
let r = t;
|
|
398
|
+
for (let o = 1; o < n; o++)
|
|
399
|
+
switch (o) {
|
|
364
400
|
case 1:
|
|
365
401
|
case 3:
|
|
366
402
|
case 5:
|
|
@@ -368,46 +404,46 @@ const b = (t) => {
|
|
|
368
404
|
case 8:
|
|
369
405
|
case 10:
|
|
370
406
|
case 12:
|
|
371
|
-
|
|
407
|
+
r += 31;
|
|
372
408
|
break;
|
|
373
409
|
case 2:
|
|
374
|
-
|
|
410
|
+
w.isLeapYear(e) ? r += 29 : r += 28;
|
|
375
411
|
break;
|
|
376
412
|
default:
|
|
377
|
-
|
|
413
|
+
r += 30;
|
|
378
414
|
break;
|
|
379
415
|
}
|
|
380
|
-
return
|
|
416
|
+
return r;
|
|
381
417
|
}
|
|
382
|
-
},
|
|
418
|
+
}, v = {
|
|
383
419
|
/**
|
|
384
420
|
* 获取元素相对于文档顶部的偏移量(距离)
|
|
385
421
|
* 处理了SVG元素的特殊情况。
|
|
386
422
|
* @param el 元素
|
|
387
423
|
* @returns 偏移量(距离值)
|
|
388
424
|
*/
|
|
389
|
-
getOffsetTop(
|
|
390
|
-
if (!
|
|
425
|
+
getOffsetTop(e) {
|
|
426
|
+
if (!e)
|
|
391
427
|
throw new Error("Element is not provided");
|
|
392
|
-
if (
|
|
393
|
-
const
|
|
394
|
-
return
|
|
428
|
+
if (e instanceof SVGElement) {
|
|
429
|
+
const t = e.getBoundingClientRect(), r = window.pageYOffset || document.documentElement.scrollTop;
|
|
430
|
+
return t.top + r;
|
|
395
431
|
}
|
|
396
|
-
let
|
|
397
|
-
for (;
|
|
398
|
-
|
|
399
|
-
return
|
|
432
|
+
let n = 0;
|
|
433
|
+
for (; e; )
|
|
434
|
+
n += e.offsetTop, e = e.offsetParent;
|
|
435
|
+
return n;
|
|
400
436
|
},
|
|
401
437
|
/**
|
|
402
438
|
* 获取文档的滚动值
|
|
403
439
|
* @returns 包含滚动值的对象 { scrollLeft: 水平滚动值, scrollTop: 垂直滚动值 }
|
|
404
440
|
*/
|
|
405
441
|
getScrollValue() {
|
|
406
|
-
const
|
|
442
|
+
const e = {
|
|
407
443
|
scrollLeft: 0,
|
|
408
444
|
scrollTop: 0
|
|
409
445
|
};
|
|
410
|
-
return
|
|
446
|
+
return e.scrollLeft = document.body.scrollLeft || document.documentElement.scrollLeft, e.scrollTop = document.body.scrollTop || document.documentElement.scrollTop, e;
|
|
411
447
|
},
|
|
412
448
|
/**
|
|
413
449
|
* 获取鼠标事件的页面坐标
|
|
@@ -417,12 +453,12 @@ const b = (t) => {
|
|
|
417
453
|
* @param e 鼠标事件
|
|
418
454
|
* @returns 包含页面坐标的对象 { pageX: 水平页面坐标, pageY: 垂直页面坐标 }
|
|
419
455
|
*/
|
|
420
|
-
getPageValue(
|
|
421
|
-
|
|
422
|
-
const
|
|
456
|
+
getPageValue(e) {
|
|
457
|
+
e = e || window.event;
|
|
458
|
+
const n = e.pageX || e.clientX + this.getScrollValue().scrollLeft, t = e.pageY || e.clientY + this.getScrollValue().scrollTop;
|
|
423
459
|
return {
|
|
424
|
-
pageX:
|
|
425
|
-
pageY:
|
|
460
|
+
pageX: n,
|
|
461
|
+
pageY: t
|
|
426
462
|
};
|
|
427
463
|
},
|
|
428
464
|
/**
|
|
@@ -433,77 +469,133 @@ const b = (t) => {
|
|
|
433
469
|
* @param fn 事件处理函数
|
|
434
470
|
*/
|
|
435
471
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
436
|
-
addEventListener(
|
|
437
|
-
|
|
472
|
+
addEventListener(e, n, t) {
|
|
473
|
+
e.addEventListener ? e.addEventListener(n, t) : e.attachEvent ? e.attachEvent("on" + n, t) : e["on" + n] = t;
|
|
438
474
|
}
|
|
439
|
-
},
|
|
475
|
+
}, R = {
|
|
440
476
|
/**
|
|
441
477
|
* 将blob对象转化成文件并导出到本地
|
|
442
478
|
* @param blob blob对象
|
|
443
479
|
* @param filename 文件名
|
|
444
480
|
*/
|
|
445
|
-
saveAsBlob(
|
|
446
|
-
const
|
|
447
|
-
|
|
481
|
+
saveAsBlob(e, n) {
|
|
482
|
+
const t = document.createElement("a"), r = window.URL.createObjectURL(e);
|
|
483
|
+
t.href = r, t.download = n, document.body.appendChild(t), t.click(), URL.revokeObjectURL(r), document.body.removeChild(t);
|
|
448
484
|
}
|
|
449
|
-
},
|
|
485
|
+
}, C = {
|
|
450
486
|
/**
|
|
451
487
|
* 将选中的字母数组从A-Z排序:用于试题选择答案的排序实例
|
|
452
488
|
* @param arr 字母数组
|
|
453
489
|
* @returns
|
|
454
490
|
*/
|
|
455
|
-
sortFromA2Z(
|
|
456
|
-
return
|
|
457
|
-
const
|
|
458
|
-
return
|
|
491
|
+
sortFromA2Z(e) {
|
|
492
|
+
return e != null && e.length ? e.sort((t, r) => {
|
|
493
|
+
const o = t.toUpperCase(), s = r.toUpperCase();
|
|
494
|
+
return o < s ? -1 : o > s ? 1 : 0;
|
|
459
495
|
}) : void 0;
|
|
460
496
|
}
|
|
461
|
-
},
|
|
497
|
+
}, k = {
|
|
462
498
|
/**
|
|
463
|
-
*
|
|
499
|
+
* 角度(度数)转弧度
|
|
464
500
|
* 在数学和编程里,角度有两种常用单位,分别是度(°)和弧度(rad)。
|
|
465
501
|
* 1 个完整的圆周,用角度表示是 360°,用弧度表示则是 2π rad。
|
|
466
502
|
* 角度和弧度的换算关系为:弧度 = 角度 × π / 180。
|
|
467
|
-
* @param
|
|
503
|
+
* @param degrees 度数。单位:°
|
|
468
504
|
* @returns 弧度值
|
|
469
505
|
*/
|
|
470
|
-
|
|
471
|
-
return
|
|
506
|
+
degrees2Radians(e) {
|
|
507
|
+
return e * Math.PI / 180;
|
|
472
508
|
},
|
|
473
509
|
/**
|
|
474
|
-
*
|
|
510
|
+
* 根据经纬度计算距离【弃用】
|
|
475
511
|
* @param userLat 用户纬度
|
|
476
512
|
* @param userLng 用户经度
|
|
477
513
|
* @param targetLat 目标纬度
|
|
478
514
|
* @param targetLng 目标经度
|
|
479
515
|
* @returns 距离值 单位:km
|
|
480
516
|
*/
|
|
481
|
-
getDistance(
|
|
482
|
-
const
|
|
517
|
+
getDistance(e, n, t, r) {
|
|
518
|
+
const o = this.degrees2Radians(e), s = this.degrees2Radians(t), l = o - s, c = this.degrees2Radians(n) - this.degrees2Radians(r);
|
|
483
519
|
let a = 2 * Math.asin(
|
|
484
520
|
Math.sqrt(
|
|
485
|
-
Math.pow(Math.sin(l / 2), 2) + Math.cos(
|
|
521
|
+
Math.pow(Math.sin(l / 2), 2) + Math.cos(o) * Math.cos(s) * Math.pow(Math.sin(c / 2), 2)
|
|
486
522
|
)
|
|
487
523
|
);
|
|
488
524
|
return a = a * 6378.137, a = Math.round(a * 1e4) / 1e4, a = +a.toFixed(2), console.log("经纬度计算的距离为:" + a), a;
|
|
525
|
+
},
|
|
526
|
+
/**
|
|
527
|
+
* 计算两个坐标点之间的距离(Haversine公式)
|
|
528
|
+
* Haversine公式:
|
|
529
|
+
* a = sin²(Δlat/2) + cos(lat1)·cos(lat2)·sin²(Δlon/2) 其中:
|
|
530
|
+
* lat1, lat2: 两点的纬度(弧度)
|
|
531
|
+
* Δlat: 两点纬度之差(弧度)
|
|
532
|
+
* Δlon: 两点经度之差(弧度)
|
|
533
|
+
* c = 2·atan2(√a, √(1−a))
|
|
534
|
+
* d = R·c 其中:
|
|
535
|
+
* R: 地球半径(平均约 6371km)
|
|
536
|
+
* @param point1 坐标点1
|
|
537
|
+
* @param point2 坐标点2
|
|
538
|
+
* @param unit 距离单位,默认单位为千米。可选值:km(千米)、m(米)、mi(英里)、nmi(海里)
|
|
539
|
+
* @returns 距离值
|
|
540
|
+
*/
|
|
541
|
+
calculateDistanceByHaversine(e, n, t = "km") {
|
|
542
|
+
const r = this, o = e.longitude ?? e.lng, s = e.latitude ?? e.lat, l = n.longitude ?? n.lng, c = n.latitude ?? n.lat;
|
|
543
|
+
if (o === void 0 || s === void 0 || l === void 0 || c === void 0)
|
|
544
|
+
throw new Error("无效的坐标格式,缺少经纬度信息");
|
|
545
|
+
const a = 6371, g = r.degrees2Radians(s), i = r.degrees2Radians(c), u = r.degrees2Radians(c - s), f = r.degrees2Radians(l - o), d = Math.sin(u / 2) * Math.sin(u / 2) + Math.cos(g) * Math.cos(i) * Math.sin(f / 2) * Math.sin(f / 2), p = 2 * Math.atan2(Math.sqrt(d), Math.sqrt(1 - d)), h = a * p;
|
|
546
|
+
switch (t) {
|
|
547
|
+
case "m":
|
|
548
|
+
return h * 1e3;
|
|
549
|
+
// 米
|
|
550
|
+
case "mi":
|
|
551
|
+
return h * 0.621371;
|
|
552
|
+
// 英里
|
|
553
|
+
case "nmi":
|
|
554
|
+
return h * 0.539957;
|
|
555
|
+
// 海里
|
|
556
|
+
default:
|
|
557
|
+
return h;
|
|
558
|
+
}
|
|
559
|
+
},
|
|
560
|
+
/**
|
|
561
|
+
* 计算多个坐标点之间的总距离(Haversine公式)
|
|
562
|
+
* @param points 坐标点数组
|
|
563
|
+
* @param unit 距离单位,默认单位为千米。可选值:km(千米)、m(米)、mi(英里)、nmi(海里)
|
|
564
|
+
* @param closed 是否闭合路径,默认不闭合
|
|
565
|
+
* @returns 距离结果对象。包含每个距离段的数组(segments)和总距离(total)。
|
|
566
|
+
*/
|
|
567
|
+
calculateDistancesByHaversine(e, n = "km", t = !1) {
|
|
568
|
+
if (e.length < 2)
|
|
569
|
+
return { segments: [], total: 0 };
|
|
570
|
+
const r = [];
|
|
571
|
+
let o = 0;
|
|
572
|
+
for (let s = 0; s < e.length - 1; s++) {
|
|
573
|
+
const l = this.calculateDistanceByHaversine(e[s], e[s + 1], n);
|
|
574
|
+
r.push(l), o += l;
|
|
575
|
+
}
|
|
576
|
+
if (t && e.length > 2) {
|
|
577
|
+
const s = this.calculateDistanceByHaversine(e[e.length - 1], e[0], n);
|
|
578
|
+
r.push(s), o += s;
|
|
579
|
+
}
|
|
580
|
+
return { segments: r, total: o };
|
|
489
581
|
}
|
|
490
582
|
};
|
|
491
|
-
class
|
|
583
|
+
class B {
|
|
492
584
|
/**
|
|
493
585
|
* 转换为标准金额格式(带千分位和两位小数)
|
|
494
586
|
* @param num 要转换的数字
|
|
495
587
|
* @returns 格式化后的字符串
|
|
496
588
|
*/
|
|
497
|
-
static toStandardFormat(
|
|
589
|
+
static toStandardFormat(n) {
|
|
498
590
|
try {
|
|
499
|
-
const
|
|
500
|
-
if (isNaN(
|
|
591
|
+
const t = typeof n == "string" ? parseFloat(n) : n;
|
|
592
|
+
if (isNaN(t))
|
|
501
593
|
throw new Error("输入不是有效的数字");
|
|
502
|
-
if (!isFinite(
|
|
594
|
+
if (!isFinite(t))
|
|
503
595
|
throw new Error("输入是无穷大");
|
|
504
|
-
return
|
|
505
|
-
} catch (
|
|
506
|
-
return console.error("格式化失败:",
|
|
596
|
+
return t.toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
|
|
597
|
+
} catch (t) {
|
|
598
|
+
return console.error("格式化失败:", t), "格式错误";
|
|
507
599
|
}
|
|
508
600
|
}
|
|
509
601
|
/**
|
|
@@ -511,63 +603,63 @@ class I {
|
|
|
511
603
|
* @param num 要转换的数字
|
|
512
604
|
* @returns 中文大写金额字符串
|
|
513
605
|
*/
|
|
514
|
-
static toChineseFormat(
|
|
606
|
+
static toChineseFormat(n) {
|
|
515
607
|
try {
|
|
516
|
-
const
|
|
517
|
-
if (isNaN(
|
|
608
|
+
const t = typeof n == "string" ? parseFloat(n) : n;
|
|
609
|
+
if (isNaN(t))
|
|
518
610
|
throw new Error("输入不是有效的数字");
|
|
519
|
-
if (
|
|
611
|
+
if (t > 9999999999999e-2 || t < -9999999999999e-2)
|
|
520
612
|
throw new Error("输入数字超出范围");
|
|
521
|
-
const
|
|
522
|
-
let i = "",
|
|
523
|
-
if (
|
|
613
|
+
const r = t < 0, o = Math.abs(t), s = Math.floor(o), l = Math.round((o - s) * 100), c = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"], a = ["", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟"], g = ["角", "分"];
|
|
614
|
+
let i = "", u = s;
|
|
615
|
+
if (u === 0)
|
|
524
616
|
i = c[0];
|
|
525
617
|
else {
|
|
526
618
|
let p = 0;
|
|
527
|
-
for (;
|
|
528
|
-
const
|
|
529
|
-
|
|
619
|
+
for (; u > 0; ) {
|
|
620
|
+
const h = u % 10;
|
|
621
|
+
h !== 0 ? i = c[h] + a[p] + i : i.charAt(0) !== c[0] && (i = c[h] + i), u = Math.floor(u / 10), p++;
|
|
530
622
|
}
|
|
531
623
|
i = i.replace(/零+/g, "零"), i = i.replace(/零+$/, "");
|
|
532
624
|
}
|
|
533
|
-
let
|
|
625
|
+
let f = "";
|
|
534
626
|
if (l > 0) {
|
|
535
|
-
const p = Math.floor(l / 10),
|
|
536
|
-
p > 0 && (
|
|
627
|
+
const p = Math.floor(l / 10), h = l % 10;
|
|
628
|
+
p > 0 && (f += c[p] + g[0]), h > 0 && (f += c[h] + g[1]);
|
|
537
629
|
} else
|
|
538
|
-
|
|
539
|
-
let
|
|
540
|
-
return
|
|
541
|
-
} catch (
|
|
542
|
-
return console.error("转换失败:",
|
|
630
|
+
f = "整";
|
|
631
|
+
let d = (r ? "负" : "") + i + "圆" + f;
|
|
632
|
+
return d === "零圆整" && (d = "零圆"), d;
|
|
633
|
+
} catch (t) {
|
|
634
|
+
return console.error("转换失败:", t), "格式错误";
|
|
543
635
|
}
|
|
544
636
|
}
|
|
545
637
|
}
|
|
546
|
-
const
|
|
638
|
+
const M = (e) => e > 25 || e < 0 ? "" : "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[e], x = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
547
639
|
__proto__: null,
|
|
548
|
-
toLetter:
|
|
549
|
-
}, Symbol.toStringTag, { value: "Module" })),
|
|
640
|
+
toLetter: M
|
|
641
|
+
}, Symbol.toStringTag, { value: "Module" })), S = (e) => e.toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","), O = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
550
642
|
__proto__: null,
|
|
551
|
-
toMoney:
|
|
552
|
-
}, Symbol.toStringTag, { value: "Module" })),
|
|
553
|
-
...
|
|
643
|
+
toMoney: S
|
|
644
|
+
}, Symbol.toStringTag, { value: "Module" })), V = {
|
|
645
|
+
...x,
|
|
554
646
|
...O,
|
|
555
647
|
/**
|
|
556
648
|
* 判断是否为数字
|
|
557
649
|
* @param val 待判断的值
|
|
558
650
|
* @returns 是否为数字。true 是;false 否
|
|
559
651
|
*/
|
|
560
|
-
isNumber(
|
|
561
|
-
return typeof
|
|
652
|
+
isNumber(e) {
|
|
653
|
+
return typeof e == "number" && !isNaN(e);
|
|
562
654
|
}
|
|
563
|
-
},
|
|
655
|
+
}, _ = {
|
|
564
656
|
/**
|
|
565
657
|
* 判断对象是否为空
|
|
566
658
|
* @param obj 对象
|
|
567
659
|
* @returns 是否为空。true 为空;false 不为空
|
|
568
660
|
*/
|
|
569
|
-
isEmptyObject(
|
|
570
|
-
return
|
|
661
|
+
isEmptyObject(e) {
|
|
662
|
+
return e ? Object.keys(e).length === 0 && e.constructor === Object : !0;
|
|
571
663
|
},
|
|
572
664
|
/**
|
|
573
665
|
* 复制对象【对象的浅拷贝 把obj1的成员,复制给obj2】
|
|
@@ -575,9 +667,9 @@ const w = (t) => t > 25 || t < 0 ? "" : "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[t], S = /*
|
|
|
575
667
|
* @param obj2 目标对象
|
|
576
668
|
*/
|
|
577
669
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
578
|
-
copy(
|
|
579
|
-
for (const
|
|
580
|
-
|
|
670
|
+
copy(e, n) {
|
|
671
|
+
for (const t in e)
|
|
672
|
+
n[t] = e[t];
|
|
581
673
|
},
|
|
582
674
|
/**
|
|
583
675
|
* 对象的深拷贝 把o1 的成员,复制给o2
|
|
@@ -585,22 +677,22 @@ const w = (t) => t > 25 || t < 0 ? "" : "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[t], S = /*
|
|
|
585
677
|
* @param o2
|
|
586
678
|
*/
|
|
587
679
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
588
|
-
deepCopy(
|
|
589
|
-
for (const
|
|
590
|
-
const
|
|
591
|
-
|
|
680
|
+
deepCopy(e, n) {
|
|
681
|
+
for (const t in e) {
|
|
682
|
+
const r = e[t];
|
|
683
|
+
r instanceof Object ? (n[t] = {}, this.deepCopy(r, n[t])) : r instanceof Array ? (n[t] = [], this.deepCopy(r, n[t])) : n[t] = e[t];
|
|
592
684
|
}
|
|
593
685
|
}
|
|
594
|
-
},
|
|
686
|
+
}, T = {
|
|
595
687
|
/**
|
|
596
688
|
* 脱敏
|
|
597
689
|
* @param phone 电话号码/手机号码
|
|
598
690
|
* @returns 脱敏后的电话号码/手机号码
|
|
599
691
|
*/
|
|
600
|
-
desensitize(
|
|
601
|
-
return
|
|
692
|
+
desensitize(e) {
|
|
693
|
+
return e ? e.replace(/^(\d{3})\d{4}(\d{4})$/, "$1****$2") || e.slice(0, 3) + "****" + e.slice(7) : "";
|
|
602
694
|
}
|
|
603
|
-
},
|
|
695
|
+
}, $ = {
|
|
604
696
|
/**
|
|
605
697
|
* 生成随机颜色
|
|
606
698
|
* @returns 随机颜色值
|
|
@@ -614,8 +706,8 @@ const w = (t) => t > 25 || t < 0 ? "" : "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[t], S = /*
|
|
|
614
706
|
* @param max 最大值
|
|
615
707
|
* @returns 随机数
|
|
616
708
|
*/
|
|
617
|
-
int(
|
|
618
|
-
return Math.floor(Math.random() * (
|
|
709
|
+
int(e, n) {
|
|
710
|
+
return Math.floor(Math.random() * (n - e + 1)) + e;
|
|
619
711
|
},
|
|
620
712
|
/**
|
|
621
713
|
* 生成唯一ID(时间戳+随机数)
|
|
@@ -624,52 +716,89 @@ const w = (t) => t > 25 || t < 0 ? "" : "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[t], S = /*
|
|
|
624
716
|
uniqueId() {
|
|
625
717
|
return Date.now().toString(36) + Math.random().toString(36).substr(2, 5);
|
|
626
718
|
}
|
|
627
|
-
},
|
|
719
|
+
}, N = {
|
|
720
|
+
/**
|
|
721
|
+
* 验证手机号
|
|
722
|
+
*/
|
|
723
|
+
mobile: /^1[3-9]\d{9}$/,
|
|
724
|
+
/**
|
|
725
|
+
* 验证邮箱
|
|
726
|
+
*/
|
|
727
|
+
email: /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/,
|
|
728
|
+
/**
|
|
729
|
+
* 验证中文
|
|
730
|
+
*/
|
|
731
|
+
chinese: /^[\u4e00-\u9fa5]+$/,
|
|
732
|
+
/**
|
|
733
|
+
* 验证英文
|
|
734
|
+
*/
|
|
735
|
+
english: /^[a-zA-Z]+$/,
|
|
736
|
+
/**
|
|
737
|
+
* 验证中文开头其他结束
|
|
738
|
+
*/
|
|
739
|
+
chineseStart: /^[\u4e00-\u9fa5]+\w*$/,
|
|
740
|
+
/**
|
|
741
|
+
* 验证正整数
|
|
742
|
+
*/
|
|
743
|
+
integer: /^\d+$/,
|
|
744
|
+
/**
|
|
745
|
+
* 验证零+正整数
|
|
746
|
+
*/
|
|
747
|
+
integerAndzero: /^(0|[1-9]+[0-9]*)$/,
|
|
748
|
+
/**
|
|
749
|
+
* 验证强密码正则:密码须由大小字母+数字、大小字母+特殊符号、数字+特殊字符等组合,且存在字母时,必须包含大小写字母。长度必须8位以上
|
|
750
|
+
*/
|
|
751
|
+
strongPassword: /^(?!.*[\s\p{C}])(?:(?=.*[A-Z])(?=.*[a-z])(?=.*[\d\W])|(?=.*\d)(?=.*[^\w\s])).{8,}$/u,
|
|
752
|
+
/**
|
|
753
|
+
* 验证0.01~0.99正则:最多两位小数。0.1、0.10、0.9、0.90
|
|
754
|
+
*/
|
|
755
|
+
decimal: /^0\.(0[1-9]|[1-9][0-9]*)$/
|
|
756
|
+
}, P = {
|
|
628
757
|
/**
|
|
629
758
|
* 通过key值获取 localStorage 中存储的某个值
|
|
630
759
|
* @param key 获取的key
|
|
631
760
|
* @returns 获取的值
|
|
632
761
|
*/
|
|
633
|
-
getLocal(
|
|
634
|
-
return localStorage.getItem(
|
|
762
|
+
getLocal(e) {
|
|
763
|
+
return localStorage.getItem(e);
|
|
635
764
|
},
|
|
636
765
|
/**
|
|
637
766
|
* 设置localStorage中的某个值
|
|
638
767
|
* @param key 设置的key
|
|
639
768
|
* @param value 设置的value
|
|
640
769
|
*/
|
|
641
|
-
setLocal(
|
|
642
|
-
localStorage.setItem(
|
|
770
|
+
setLocal(e, n) {
|
|
771
|
+
localStorage.setItem(e, n);
|
|
643
772
|
},
|
|
644
773
|
/**
|
|
645
774
|
* 删除localStorage中的某个值
|
|
646
775
|
* @param key 删除的key
|
|
647
776
|
*/
|
|
648
|
-
removeLocal(
|
|
649
|
-
localStorage.removeItem(
|
|
777
|
+
removeLocal(e) {
|
|
778
|
+
localStorage.removeItem(e);
|
|
650
779
|
},
|
|
651
780
|
/**
|
|
652
781
|
* 通过key值获取 sessionStorage 中存储的某个值
|
|
653
782
|
* @param key 获取的key
|
|
654
783
|
* @returns 获取的值
|
|
655
784
|
*/
|
|
656
|
-
getSession(
|
|
657
|
-
return sessionStorage.getItem(
|
|
785
|
+
getSession(e) {
|
|
786
|
+
return sessionStorage.getItem(e);
|
|
658
787
|
},
|
|
659
788
|
/**
|
|
660
789
|
* 设置sessionStorage中的某个值
|
|
661
790
|
* @param key 设置的key
|
|
662
791
|
* @param value 设置的value
|
|
663
792
|
*/
|
|
664
|
-
setSession(
|
|
665
|
-
sessionStorage.setItem(
|
|
793
|
+
setSession(e, n) {
|
|
794
|
+
sessionStorage.setItem(e, n);
|
|
666
795
|
},
|
|
667
796
|
/**
|
|
668
797
|
* 删除sessionStorage中的某个值
|
|
669
798
|
* @param key 删除的key
|
|
670
799
|
*/
|
|
671
|
-
removeSession(
|
|
672
|
-
sessionStorage.removeItem(
|
|
800
|
+
removeSession(e) {
|
|
801
|
+
sessionStorage.removeItem(e);
|
|
673
802
|
}
|
|
674
803
|
}, D = {
|
|
675
804
|
/**
|
|
@@ -678,11 +807,11 @@ const w = (t) => t > 25 || t < 0 ? "" : "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[t], S = /*
|
|
|
678
807
|
* @param element 查询元素
|
|
679
808
|
* @returns 是否存在。true 存在;false 不存在
|
|
680
809
|
*/
|
|
681
|
-
isExist(
|
|
682
|
-
if (!
|
|
810
|
+
isExist(e, n) {
|
|
811
|
+
if (!e || !n)
|
|
683
812
|
return !1;
|
|
684
|
-
const
|
|
685
|
-
return console.log("判断某元素是否在字符串中",
|
|
813
|
+
const t = e.split(",");
|
|
814
|
+
return console.log("判断某元素是否在字符串中", t.indexOf(n) === -1), t.indexOf(n) !== -1;
|
|
686
815
|
},
|
|
687
816
|
/**
|
|
688
817
|
* 判断某元素是否在字符串中-比isExist()方法更高效。
|
|
@@ -690,17 +819,17 @@ const w = (t) => t > 25 || t < 0 ? "" : "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[t], S = /*
|
|
|
690
819
|
* @param element 查询元素
|
|
691
820
|
* @returns 是否存在。true 存在;false 不存在
|
|
692
821
|
*/
|
|
693
|
-
includes(
|
|
694
|
-
return !
|
|
822
|
+
includes(e, n) {
|
|
823
|
+
return !e || !n ? !1 : e.includes(n);
|
|
695
824
|
},
|
|
696
825
|
/**
|
|
697
826
|
* 判断字符串是否为 JSON
|
|
698
827
|
* @param str 字符串
|
|
699
828
|
* @returns
|
|
700
829
|
*/
|
|
701
|
-
isJSON(
|
|
830
|
+
isJSON(e) {
|
|
702
831
|
try {
|
|
703
|
-
return JSON.parse(
|
|
832
|
+
return JSON.parse(e), !0;
|
|
704
833
|
} catch {
|
|
705
834
|
return !1;
|
|
706
835
|
}
|
|
@@ -711,46 +840,46 @@ const w = (t) => t > 25 || t < 0 ? "" : "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[t], S = /*
|
|
|
711
840
|
* @param element 元素
|
|
712
841
|
* @returns 位置数组
|
|
713
842
|
*/
|
|
714
|
-
indexsOfAppear(
|
|
715
|
-
let
|
|
716
|
-
const
|
|
843
|
+
indexsOfAppear(e, n) {
|
|
844
|
+
let t = -1;
|
|
845
|
+
const r = [];
|
|
717
846
|
do
|
|
718
|
-
|
|
719
|
-
while (
|
|
720
|
-
return
|
|
847
|
+
t = e.indexOf(n, t + 1), t !== -1 && r.push(t);
|
|
848
|
+
while (t !== -1);
|
|
849
|
+
return r;
|
|
721
850
|
},
|
|
722
851
|
/**
|
|
723
852
|
* 获取字符串中出现次数最多的字符和次数
|
|
724
853
|
* @param string 字符串
|
|
725
854
|
* @returns 数组,第一个元素为出现次数,第二个元素为出现次数最多的字符
|
|
726
855
|
*/
|
|
727
|
-
getMaxTimesAndVal(
|
|
728
|
-
const
|
|
729
|
-
for (let s = 0; s <
|
|
730
|
-
const l =
|
|
731
|
-
|
|
856
|
+
getMaxTimesAndVal(e) {
|
|
857
|
+
const n = [0, ""], t = {};
|
|
858
|
+
for (let s = 0; s < e.length; s++) {
|
|
859
|
+
const l = e.charAt(s);
|
|
860
|
+
t[l] ? t[l]++ : t[l] = 1;
|
|
732
861
|
}
|
|
733
|
-
let
|
|
734
|
-
for (const s in
|
|
735
|
-
|
|
736
|
-
const
|
|
737
|
-
for (const s in
|
|
738
|
-
|
|
739
|
-
return
|
|
862
|
+
let r = 1;
|
|
863
|
+
for (const s in t)
|
|
864
|
+
r < t[s] && (r = t[s]);
|
|
865
|
+
const o = [];
|
|
866
|
+
for (const s in t)
|
|
867
|
+
r == t[s] && o.push(s);
|
|
868
|
+
return n[0] = r, n[1] = o.join(), n;
|
|
740
869
|
}
|
|
741
|
-
},
|
|
742
|
-
const
|
|
743
|
-
return
|
|
870
|
+
}, A = (e) => {
|
|
871
|
+
const t = new RegExp("[?&]" + e + "=([^&#]*)", "i").exec(window.location.href);
|
|
872
|
+
return t ? decodeURIComponent(t[1]) : null;
|
|
744
873
|
};
|
|
745
|
-
function
|
|
746
|
-
return new URLSearchParams(window.location.search).get(
|
|
874
|
+
function U(e) {
|
|
875
|
+
return new URLSearchParams(window.location.search).get(e);
|
|
747
876
|
}
|
|
748
|
-
const
|
|
877
|
+
const E = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
749
878
|
__proto__: null,
|
|
750
|
-
getQueryInfoByName:
|
|
751
|
-
getQueryParam:
|
|
752
|
-
}, Symbol.toStringTag, { value: "Module" })),
|
|
753
|
-
...
|
|
879
|
+
getQueryInfoByName: A,
|
|
880
|
+
getQueryParam: U
|
|
881
|
+
}, Symbol.toStringTag, { value: "Module" })), F = {
|
|
882
|
+
...E,
|
|
754
883
|
/**
|
|
755
884
|
* 获取当前域名
|
|
756
885
|
* @returns 当前url链接的host信息
|
|
@@ -765,42 +894,55 @@ const x = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
|
765
894
|
getPath() {
|
|
766
895
|
return window.location.pathname;
|
|
767
896
|
}
|
|
768
|
-
},
|
|
897
|
+
}, z = {
|
|
769
898
|
/**
|
|
770
|
-
*
|
|
899
|
+
* 处理瀑布流数据,使其竖向瀑布流布局呈现横向瀑布流的展现形式。适用于 column-gap: 20rpx; column-count: 2; 布局的瀑布流
|
|
771
900
|
* @param list 瀑布流数据-数组
|
|
772
901
|
* @param columnsNum 需要展示的列数
|
|
773
902
|
* @returns 适合瀑布流布局的数组
|
|
774
903
|
*/
|
|
775
|
-
toList(
|
|
776
|
-
console.log(
|
|
777
|
-
const
|
|
778
|
-
for (let
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
const
|
|
782
|
-
for (const
|
|
783
|
-
|
|
784
|
-
return
|
|
904
|
+
toList(e, n = 2) {
|
|
905
|
+
console.log(e, n);
|
|
906
|
+
const t = {};
|
|
907
|
+
for (let o = 0; o < n; o++)
|
|
908
|
+
t[o] = [];
|
|
909
|
+
e.forEach((o, s) => t[s % n].push(o));
|
|
910
|
+
const r = [];
|
|
911
|
+
for (const o in t)
|
|
912
|
+
r.push(...t[o]);
|
|
913
|
+
return r;
|
|
914
|
+
},
|
|
915
|
+
jsLayout(e, n, t) {
|
|
916
|
+
const r = e.offsetWidth, o = n[0].offsetWidth, s = parseInt((r / o).toString()), l = (r - o * s) / (s - 1), c = [];
|
|
917
|
+
for (let a = 0, g = n.length; a < g; a++) {
|
|
918
|
+
const i = n[a];
|
|
919
|
+
if (a < s)
|
|
920
|
+
i.style.left = (o + l) * a + "px", c[a] = i.offsetHeight;
|
|
921
|
+
else {
|
|
922
|
+
const { minI: u, minV: f } = y.getMinValueAndIndex(c);
|
|
923
|
+
i.style.left = (o + l) * u + "px", i.style.top = f + t + "px", c[u] = i.offsetHeight + t + f;
|
|
924
|
+
}
|
|
925
|
+
}
|
|
785
926
|
}
|
|
786
927
|
};
|
|
787
928
|
export {
|
|
788
|
-
|
|
789
|
-
|
|
929
|
+
B as MoneyFormatter,
|
|
930
|
+
y as arrayUtils,
|
|
790
931
|
L as base64Utils,
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
932
|
+
w as booleanUtils,
|
|
933
|
+
I as cookieUtils,
|
|
934
|
+
j as dateUtils,
|
|
935
|
+
v as documentUtils,
|
|
936
|
+
R as downloadUtils,
|
|
937
|
+
C as letterUtils,
|
|
938
|
+
k as mapUtils,
|
|
939
|
+
V as numberUtils,
|
|
940
|
+
_ as objectUtils,
|
|
941
|
+
T as phoneUtils,
|
|
942
|
+
$ as randomUtils,
|
|
943
|
+
N as regexUtils,
|
|
944
|
+
P as storageUtils,
|
|
803
945
|
D as stringUtils,
|
|
804
|
-
|
|
805
|
-
|
|
946
|
+
F as urlUtils,
|
|
947
|
+
z as waterfallUtils
|
|
806
948
|
};
|