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