@allkit/shared 0.0.1 → 0.0.3
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/package.json +1 -1
- package/{skill → dist/skills}/SKILL.md +1 -1
- package/{skill → dist/skills}/examples/usage.ts +30 -9
- package/package.json +1 -1
- package/scripts/build.mjs +6 -3
- package/skills/SKILL.md +240 -0
- package/skills/examples/usage.ts +88 -0
- package/skills/references/clipboard.md +39 -0
- package/skills/references/cloneDeep.md +60 -0
- package/skills/references/cookie.md +56 -0
- package/skills/references/date.md +466 -0
- package/skills/references/device.md +138 -0
- package/skills/references/element.md +99 -0
- package/skills/references/is.md +415 -0
- package/skills/references/lodash.md +472 -0
- package/skills/references/number.md +248 -0
- package/skills/references/storage.md +113 -0
- package/skills/references/string.md +126 -0
- package/skills/references/timer.md +78 -0
- /package/{skill → dist/skills}/references/clipboard.md +0 -0
- /package/{skill → dist/skills}/references/cloneDeep.md +0 -0
- /package/{skill → dist/skills}/references/cookie.md +0 -0
- /package/{skill → dist/skills}/references/date.md +0 -0
- /package/{skill → dist/skills}/references/device.md +0 -0
- /package/{skill → dist/skills}/references/element.md +0 -0
- /package/{skill → dist/skills}/references/is.md +0 -0
- /package/{skill → dist/skills}/references/lodash.md +0 -0
- /package/{skill → dist/skills}/references/number.md +0 -0
- /package/{skill → dist/skills}/references/storage.md +0 -0
- /package/{skill → dist/skills}/references/string.md +0 -0
- /package/{skill → dist/skills}/references/timer.md +0 -0
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
# lodash
|
|
2
|
+
|
|
3
|
+
Lodash 常用工具函数 / Common Lodash utilities
|
|
4
|
+
|
|
5
|
+
## Overview / 概述
|
|
6
|
+
|
|
7
|
+
提供常用的对象操作、函数防抖节流等工具函数。Provide common object manipulation, debounce, throttle utilities.
|
|
8
|
+
|
|
9
|
+
## Functions
|
|
10
|
+
|
|
11
|
+
### deepClone
|
|
12
|
+
|
|
13
|
+
深拷贝 / Deep clone
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
function deepClone<T>(obj: T): T
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
**Parameters / 参数**
|
|
20
|
+
|
|
21
|
+
| Name | Type | Description |
|
|
22
|
+
|------|------|-------------|
|
|
23
|
+
| `obj` | `T` | 要拷贝的对象 |
|
|
24
|
+
|
|
25
|
+
**Returns / 返回值**
|
|
26
|
+
|
|
27
|
+
- `T`: 深拷贝后的对象
|
|
28
|
+
|
|
29
|
+
**Features / 支持类型**
|
|
30
|
+
|
|
31
|
+
- 基本类型(string, number, boolean, null, undefined, symbol, bigint)
|
|
32
|
+
- 数组 / Array
|
|
33
|
+
- 对象 / Object
|
|
34
|
+
- Date
|
|
35
|
+
- RegExp
|
|
36
|
+
- Map
|
|
37
|
+
- Set
|
|
38
|
+
- 嵌套对象/数组 / Nested objects/arrays
|
|
39
|
+
|
|
40
|
+
**Example / 示例**
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
// 简单对象
|
|
44
|
+
const original = { name: 'a', person: { age: 18 } }
|
|
45
|
+
const cloned = deepClone(original)
|
|
46
|
+
cloned.person.age = 20
|
|
47
|
+
console.log(original.person.age) // 18
|
|
48
|
+
|
|
49
|
+
// 数组
|
|
50
|
+
const arr = [1, 2, { a: 1 }]
|
|
51
|
+
const arrClone = deepClone(arr)
|
|
52
|
+
|
|
53
|
+
// Date
|
|
54
|
+
const date = new Date()
|
|
55
|
+
const dateClone = deepClone(date)
|
|
56
|
+
|
|
57
|
+
// RegExp
|
|
58
|
+
const reg = /test/g
|
|
59
|
+
const regClone = deepClone(reg)
|
|
60
|
+
|
|
61
|
+
// Map
|
|
62
|
+
const map = new Map([['key', 'value']])
|
|
63
|
+
const mapClone = deepClone(map)
|
|
64
|
+
|
|
65
|
+
// Set
|
|
66
|
+
const set = new Set([1, 2, 3])
|
|
67
|
+
const setClone = deepClone(set)
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
### omit
|
|
73
|
+
|
|
74
|
+
删除对象中的某些键值对 / Omit fields from object
|
|
75
|
+
|
|
76
|
+
```ts
|
|
77
|
+
function omit<T, K extends keyof T>(obj: T, fields: K[], ignoreEmpty?: boolean): Omit<T, K>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**Parameters / 参数**
|
|
81
|
+
|
|
82
|
+
| Name | Type | Description |
|
|
83
|
+
|------|------|-------------|
|
|
84
|
+
| `obj` | `T` | 源对象 |
|
|
85
|
+
| `fields` | `K[]` | 要删除的键名数组 |
|
|
86
|
+
| `ignoreEmpty` | `boolean` | 是否忽略空值 |
|
|
87
|
+
|
|
88
|
+
**Example / 示例**
|
|
89
|
+
|
|
90
|
+
```ts
|
|
91
|
+
const obj = { a: 1, b: 2, c: 3 }
|
|
92
|
+
omit(obj, ['a']) // { b: 2, c: 3 }
|
|
93
|
+
omit(obj, ['a', 'b']) // { c: 3 }
|
|
94
|
+
|
|
95
|
+
// 忽略空值
|
|
96
|
+
omit({ a: 1, b: undefined }, ['b'], true) // { a: 1 }
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
### pick
|
|
102
|
+
|
|
103
|
+
从对象中取出指定的键值对 / Pick fields from object
|
|
104
|
+
|
|
105
|
+
```ts
|
|
106
|
+
function pick<T, K extends keyof T>(obj: T, keys: K[], ignoreEmpty?: boolean): Pick<T, K>
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**Parameters / 参数**
|
|
110
|
+
|
|
111
|
+
| Name | Type | Description |
|
|
112
|
+
|------|------|-------------|
|
|
113
|
+
| `obj` | `T` | 源对象 |
|
|
114
|
+
| `keys` | `K[]` | 要保留的键名数组 |
|
|
115
|
+
| `ignoreEmpty` | `boolean` | 是否忽略空值 |
|
|
116
|
+
|
|
117
|
+
**Example / 示例**
|
|
118
|
+
|
|
119
|
+
```ts
|
|
120
|
+
const obj = { a: 1, b: 2, c: 3 }
|
|
121
|
+
pick(obj, ['a', 'b']) // { a: 1, b: 2 }
|
|
122
|
+
pick(obj, ['a', 'd']) // { a: 1 } (d 不存在)
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
### pickBy
|
|
128
|
+
|
|
129
|
+
根据断言函数取出键值对 / Pick fields by predicate
|
|
130
|
+
|
|
131
|
+
```ts
|
|
132
|
+
function pickBy<T>(obj: T, predicate: (value: any, key: keyof T) => boolean): Partial<T>
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
**Example / 示例**
|
|
136
|
+
|
|
137
|
+
```ts
|
|
138
|
+
const obj = { a: 1, b: 2, c: 3, d: 4 }
|
|
139
|
+
pickBy(obj, (value) => value > 2) // { c: 3, d: 4 }
|
|
140
|
+
pickBy(obj, (_, key) => key !== 'a') // { b: 2, c: 3, d: 4 }
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
### omitBy
|
|
146
|
+
|
|
147
|
+
根据断言函数删除键值对 / Omit fields by predicate
|
|
148
|
+
|
|
149
|
+
```ts
|
|
150
|
+
function omitBy<T>(obj: T, predicate: (value: any, key: keyof T) => boolean): Partial<T>
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
**Example / 示例**
|
|
154
|
+
|
|
155
|
+
```ts
|
|
156
|
+
const obj = { a: 1, b: 2, c: 3, d: 4 }
|
|
157
|
+
omitBy(obj, (value) => value > 2) // { a: 1, b: 2 }
|
|
158
|
+
omitBy(obj, (_, key) => key === 'a') // { b: 2, c: 3, d: 4 }
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
### debounce
|
|
164
|
+
|
|
165
|
+
防抖函数 / Debounce function
|
|
166
|
+
|
|
167
|
+
```ts
|
|
168
|
+
function debounce<T extends (...args: any[]) => any>(fn: T, delay: number): T & { cancel: () => void }
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
**Parameters / 参数**
|
|
172
|
+
|
|
173
|
+
| Name | Type | Description |
|
|
174
|
+
|------|------|-------------|
|
|
175
|
+
| `fn` | `T` | 要防抖的函数 |
|
|
176
|
+
| `delay` | `number` | 延迟时间(毫秒) |
|
|
177
|
+
|
|
178
|
+
**Returns / 返回值**
|
|
179
|
+
|
|
180
|
+
- `T & { cancel: () => void }`: 防抖后的函数,包含 cancel 方法
|
|
181
|
+
|
|
182
|
+
**Example / 示例**
|
|
183
|
+
|
|
184
|
+
```ts
|
|
185
|
+
// 搜索防抖
|
|
186
|
+
const debounceSearch = debounce((keyword: string) => {
|
|
187
|
+
console.log('搜索:', keyword)
|
|
188
|
+
// 执行搜索 API
|
|
189
|
+
}, 300)
|
|
190
|
+
|
|
191
|
+
// 模拟输入
|
|
192
|
+
input.oninput = (e) => {
|
|
193
|
+
debounceSearch(e.target.value)
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// 取消
|
|
197
|
+
debounceSearch.cancel()
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
**场景说明 / Scenario**
|
|
201
|
+
|
|
202
|
+
- 搜索框输入防抖:用户输入停止 300ms 后才触发搜索
|
|
203
|
+
- 窗口 resize 防抖:窗口调整大小停止后执行
|
|
204
|
+
- 表单验证:输入停止后验证
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
### throttle
|
|
209
|
+
|
|
210
|
+
节流函数 / Throttle function
|
|
211
|
+
|
|
212
|
+
```ts
|
|
213
|
+
function throttle<T extends (...args: any[]) => any>(fn: T, delay: number): T & { cancel: () => void }
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
**Parameters / 参数**
|
|
217
|
+
|
|
218
|
+
| Name | Type | Description |
|
|
219
|
+
|------|------|-------------|
|
|
220
|
+
| `fn` | `T` | 要节流的函数 |
|
|
221
|
+
| `delay` | `number` | 间隔时间(毫秒) |
|
|
222
|
+
|
|
223
|
+
**Returns / 返回值**
|
|
224
|
+
|
|
225
|
+
- `T & { cancel: () => void }`: 节流后的函数,包含 cancel 方法
|
|
226
|
+
|
|
227
|
+
**Example / 示例**
|
|
228
|
+
|
|
229
|
+
```ts
|
|
230
|
+
// 滚动节流
|
|
231
|
+
const throttleScroll = throttle(() => {
|
|
232
|
+
console.log('滚动位置:', window.scrollY)
|
|
233
|
+
}, 100)
|
|
234
|
+
|
|
235
|
+
window.addEventListener('scroll', throttleScroll)
|
|
236
|
+
|
|
237
|
+
// 点击节流(防止重复提交)
|
|
238
|
+
const throttleSubmit = throttle(() => {
|
|
239
|
+
console.log('提交表单')
|
|
240
|
+
// 执行提交
|
|
241
|
+
}, 2000)
|
|
242
|
+
|
|
243
|
+
button.onclick = () => throttleSubmit()
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
**场景说明 / Scenario**
|
|
247
|
+
|
|
248
|
+
- 滚动事件:限制触发频率
|
|
249
|
+
- 按钮点击:防止重复提交
|
|
250
|
+
- 拖拽事件:减少计算次数
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
### merge
|
|
255
|
+
|
|
256
|
+
合并对象 / Merge objects
|
|
257
|
+
|
|
258
|
+
```ts
|
|
259
|
+
function merge<T>(target: T, source: any): T & any
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
**Example / 示例**
|
|
263
|
+
|
|
264
|
+
```ts
|
|
265
|
+
const target = { a: 1, b: 2 }
|
|
266
|
+
const source = { b: 3, c: 4 }
|
|
267
|
+
merge(target, source) // { a: 1, b: 3, c: 4 }
|
|
268
|
+
|
|
269
|
+
// 数组会被替换而非合并
|
|
270
|
+
merge({ arr: [1] }, { arr: [2] }) // { arr: [2] }
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
### uniqueId
|
|
276
|
+
|
|
277
|
+
生成浏览器唯一 ID / Generate unique ID
|
|
278
|
+
|
|
279
|
+
```ts
|
|
280
|
+
function uniqueId(length?: number): string
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
**Parameters / 参数**
|
|
284
|
+
|
|
285
|
+
| Name | Type | Default | Description |
|
|
286
|
+
|------|------|---------|-------------|
|
|
287
|
+
| `length` | `number` | `16` | ID 长度 |
|
|
288
|
+
|
|
289
|
+
**Example / 示例**
|
|
290
|
+
|
|
291
|
+
```ts
|
|
292
|
+
uniqueId() // 16 位: 'a1b2c3d4e5f6g7h8'
|
|
293
|
+
uniqueId(8) // 8 位: 'a1b2c3d4'
|
|
294
|
+
uniqueId(32) // 32 位
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
**Use Cases / 使用场景**
|
|
298
|
+
|
|
299
|
+
- 生成组件唯一 ID
|
|
300
|
+
- 生成缓存 key
|
|
301
|
+
- 生成临时文件名
|
|
302
|
+
|
|
303
|
+
---
|
|
304
|
+
|
|
305
|
+
### get
|
|
306
|
+
|
|
307
|
+
从对象中获取指定路径的值 / Get value by path
|
|
308
|
+
|
|
309
|
+
```ts
|
|
310
|
+
function get(obj: any, path: string | string[], defaultValue?: any): any
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
**Parameters / 参数**
|
|
314
|
+
|
|
315
|
+
| Name | Type | Description |
|
|
316
|
+
|------|------|-------------|
|
|
317
|
+
| `obj` | `any` | 源对象 |
|
|
318
|
+
| `path` | `string \| string[]` | 属性路径,支持点号或数组 |
|
|
319
|
+
| `defaultValue` | `any` | 默认值 |
|
|
320
|
+
|
|
321
|
+
**Example / 示例**
|
|
322
|
+
|
|
323
|
+
```ts
|
|
324
|
+
const obj = { a: { b: { c: 1 } } }
|
|
325
|
+
|
|
326
|
+
// 点号路径
|
|
327
|
+
get(obj, 'a.b.c') // 1
|
|
328
|
+
get(obj, 'a.b.d', 0) // 0 (默认值)
|
|
329
|
+
|
|
330
|
+
// 数组路径
|
|
331
|
+
get(obj, ['a', 'b', 'c']) // 1
|
|
332
|
+
|
|
333
|
+
// 不存在的路径
|
|
334
|
+
get(obj, 'a.b.c.d', 'N/A') // 'N/A'
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
---
|
|
338
|
+
|
|
339
|
+
### objToQString
|
|
340
|
+
|
|
341
|
+
对象转 URL 字符串 / Object to query string
|
|
342
|
+
|
|
343
|
+
```ts
|
|
344
|
+
function objToQString(obj: object): string
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
**Example / 示例**
|
|
348
|
+
|
|
349
|
+
```ts
|
|
350
|
+
objToQString({ a: 1, b: 2 }) // 'a=1&b=2'
|
|
351
|
+
objToQString({ name: '张三', age: 18 }) // 'name=%E5%BC%A0%E4%B8%89&age=18'
|
|
352
|
+
objToQString({ ids: [1, 2, 3] }) // 'ids=1&ids=2&ids=3'
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
---
|
|
356
|
+
|
|
357
|
+
### qStringToObj
|
|
358
|
+
|
|
359
|
+
URL 字符串转对象 / Query string to object
|
|
360
|
+
|
|
361
|
+
```ts
|
|
362
|
+
function qStringToObj(queryString: string): object
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
**Example / 示例**
|
|
366
|
+
|
|
367
|
+
```ts
|
|
368
|
+
qStringToObj('a=1&b=2') // { a: '1', b: '2' }
|
|
369
|
+
qStringToObj('name=%E5%BC%A0%E4%B8%89') // { name: '张三' }
|
|
370
|
+
qStringToObj('ids=1&ids=2&ids=3') // { ids: ['1', '2', '3'] }
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
---
|
|
374
|
+
|
|
375
|
+
### blobToBase64
|
|
376
|
+
|
|
377
|
+
Blob 转 Base64 / Blob to Base64
|
|
378
|
+
|
|
379
|
+
```ts
|
|
380
|
+
function blobToBase64(blob: Blob, ignorePrefix?: boolean): string
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
**Parameters / 参数**
|
|
384
|
+
|
|
385
|
+
| Name | Type | Default | Description |
|
|
386
|
+
|------|------|---------|-------------|
|
|
387
|
+
| `blob` | `Blob` | - | Blob 对象 |
|
|
388
|
+
| `ignorePrefix` | `boolean` | `false` | 是否忽略 data URL 前缀 |
|
|
389
|
+
|
|
390
|
+
**Example / 示例**
|
|
391
|
+
|
|
392
|
+
```ts
|
|
393
|
+
// 完整 Base64 (包含前缀)
|
|
394
|
+
blobToBase64(blob)
|
|
395
|
+
// 'data:image/png;base64,iVBORw0KGgo...'
|
|
396
|
+
|
|
397
|
+
// 纯 Base64 (无前缀)
|
|
398
|
+
blobToBase64(blob, true)
|
|
399
|
+
// 'iVBORw0KGgo...'
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
---
|
|
403
|
+
|
|
404
|
+
## Use Cases / 使用场景
|
|
405
|
+
|
|
406
|
+
### 表单数据处理 / Form Data Processing
|
|
407
|
+
|
|
408
|
+
```ts
|
|
409
|
+
// 只提交表单中的部分字段
|
|
410
|
+
const formData = { name: '', email: '', password: '', remember: true }
|
|
411
|
+
const submitData = pick(formData, ['name', 'email', 'password'])
|
|
412
|
+
// { name: '', email: '', password: '' }
|
|
413
|
+
|
|
414
|
+
// 排除敏感字段
|
|
415
|
+
const userData = { id: 1, name: '张三', password: 'xxx', token: 'xxx' }
|
|
416
|
+
const publicData = omit(userData, ['password', 'token'])
|
|
417
|
+
// { id: 1, name: '张三' }
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
### 防抖搜索 / Debounced Search
|
|
421
|
+
|
|
422
|
+
```ts
|
|
423
|
+
const handleSearch = debounce(async (keyword: string) => {
|
|
424
|
+
const results = await searchAPI(keyword)
|
|
425
|
+
setResults(results)
|
|
426
|
+
}, 300)
|
|
427
|
+
|
|
428
|
+
input.addEventListener('input', (e) => {
|
|
429
|
+
handleSearch(e.target.value)
|
|
430
|
+
})
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
### 安全获取嵌套属性 / Safe Nested Property Access
|
|
434
|
+
|
|
435
|
+
```ts
|
|
436
|
+
// 传统方式
|
|
437
|
+
const value = obj && obj.a && obj.a.b && obj.a.b.c
|
|
438
|
+
|
|
439
|
+
// 使用 get
|
|
440
|
+
const value = get(obj, 'a.b.c', 'default')
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
### 处理 URL 参数 / Handle URL Parameters
|
|
444
|
+
|
|
445
|
+
```ts
|
|
446
|
+
// 解析 URL 参数
|
|
447
|
+
const params = qStringToObj(window.location.search.slice(1))
|
|
448
|
+
|
|
449
|
+
// 构建 URL 参数
|
|
450
|
+
const query = objToQString({ page: 1, size: 10, keyword: 'test' })
|
|
451
|
+
// 'page=1&size=10&keyword=test'
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
### 图片上传预览 / Image Upload Preview
|
|
455
|
+
|
|
456
|
+
```ts
|
|
457
|
+
fileInput.addEventListener('change', async (e) => {
|
|
458
|
+
const file = e.target.files[0]
|
|
459
|
+
const base64 = await fileToBase64(file)
|
|
460
|
+
img.src = base64
|
|
461
|
+
})
|
|
462
|
+
|
|
463
|
+
function fileToBase64(file: File): Promise<string> {
|
|
464
|
+
return new Promise((resolve) => {
|
|
465
|
+
const reader = new FileReader()
|
|
466
|
+
reader.onload = () => {
|
|
467
|
+
resolve(reader.result as string)
|
|
468
|
+
}
|
|
469
|
+
reader.readAsDataURL(file)
|
|
470
|
+
})
|
|
471
|
+
}
|
|
472
|
+
```
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
# number
|
|
2
|
+
|
|
3
|
+
数字处理工具函数 / Number utilities
|
|
4
|
+
|
|
5
|
+
基于 big.js / Based on big.js
|
|
6
|
+
|
|
7
|
+
## Overview / 概述
|
|
8
|
+
|
|
9
|
+
提供一系列数字处理函数,包括精度计算、数字格式化、金钱格式化等。基于 [big.js](https://github.com/MikeMcl/big.js/) 库,解决 JavaScript 浮点数精度问题。
|
|
10
|
+
|
|
11
|
+
Provide a series of number handling functions including precision calculation, number formatting, money formatting, etc. Based on [big.js](https://github.com/MikeMcl/big.js/) to solve JavaScript floating point precision problems.
|
|
12
|
+
|
|
13
|
+
## Functions
|
|
14
|
+
|
|
15
|
+
### useNumber
|
|
16
|
+
|
|
17
|
+
返回实例化的 Big 对象 / Get Big instance
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
function useNumber(n: BigSource): Big
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**Parameters / 参数**
|
|
24
|
+
|
|
25
|
+
| Name | Type | Description |
|
|
26
|
+
|------|------|-------------|
|
|
27
|
+
| `n` | `BigSource` | 数字或字符串 |
|
|
28
|
+
|
|
29
|
+
**Returns / 返回值**
|
|
30
|
+
|
|
31
|
+
- `Big`: Big.js 实例
|
|
32
|
+
|
|
33
|
+
**Example / 示例**
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
// 加法
|
|
37
|
+
useNumber('1').add('2').toNumber() // 3
|
|
38
|
+
|
|
39
|
+
// 减法
|
|
40
|
+
useNumber('2').sub('1').toNumber() // 1
|
|
41
|
+
|
|
42
|
+
// 乘法
|
|
43
|
+
useNumber(1).times(2).toNumber() // 2
|
|
44
|
+
|
|
45
|
+
// 除法
|
|
46
|
+
useNumber(2).div(1).toNumber() // 2
|
|
47
|
+
|
|
48
|
+
// 四舍五入
|
|
49
|
+
useNumber('1.5').round(0, 1).toNumber() // 2
|
|
50
|
+
|
|
51
|
+
// 精度计算
|
|
52
|
+
useNumber('0.1').add('0.2').toNumber() // 0.3 (不会有精度问题)
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
### formatMoney
|
|
58
|
+
|
|
59
|
+
格式化金钱(万、亿)/ Format money (万/亿)
|
|
60
|
+
|
|
61
|
+
```ts
|
|
62
|
+
function formatMoney(num: number): string
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**Parameters / 参数**
|
|
66
|
+
|
|
67
|
+
| Name | Type | Description |
|
|
68
|
+
|------|------|-------------|
|
|
69
|
+
| `num` | `number` | 要格式化的数字 |
|
|
70
|
+
|
|
71
|
+
**Returns / 返回值**
|
|
72
|
+
|
|
73
|
+
- `string`: 格式化后的金钱字符串
|
|
74
|
+
|
|
75
|
+
**Example / 示例**
|
|
76
|
+
|
|
77
|
+
```ts
|
|
78
|
+
// 小于等于4位
|
|
79
|
+
formatMoney(1234) // '1234'
|
|
80
|
+
|
|
81
|
+
// 5-8位 (万)
|
|
82
|
+
formatMoney(12345) // '1万2345'
|
|
83
|
+
formatMoney(10000) // '1万'
|
|
84
|
+
formatMoney(1234567) // '123万4567'
|
|
85
|
+
|
|
86
|
+
// 9-12位 (亿)
|
|
87
|
+
formatMoney(123456789) // '1亿2345万6789'
|
|
88
|
+
formatMoney(100000000) // '1亿'
|
|
89
|
+
formatMoney(100000001) // '1亿1'
|
|
90
|
+
|
|
91
|
+
// 大于12位
|
|
92
|
+
formatMoney(9007199254740992) // '90071992亿5474万992'
|
|
93
|
+
formatMoney(12345678901234) // '1234亿5678万9012'
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
### formatNumber
|
|
99
|
+
|
|
100
|
+
格式化数字(千位分隔符)/ Format number with separator
|
|
101
|
+
|
|
102
|
+
```ts
|
|
103
|
+
function formatNumber(val: number | string, options?: FormatOptions): string
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**Parameters / 参数**
|
|
107
|
+
|
|
108
|
+
| Name | Type | Default | Description |
|
|
109
|
+
|------|------|---------|-------------|
|
|
110
|
+
| `val` | `number \| string` | - | 要格式化的数字 |
|
|
111
|
+
| `options.precision` | `number` | `0` | 保留小数位数 |
|
|
112
|
+
| `options.thousandSeparator` | `string` | `,` | 千位分隔符 |
|
|
113
|
+
| `options.bit` | `number` | `3` | 分隔位数 |
|
|
114
|
+
| `options.roundMode` | `RoundingMode` | `1` | 舍入模式 |
|
|
115
|
+
|
|
116
|
+
**RoundingMode / 舍入模式**
|
|
117
|
+
|
|
118
|
+
| Mode | Description |
|
|
119
|
+
|------|-------------|
|
|
120
|
+
| 0 | 向下取整 |
|
|
121
|
+
| 1 | 四舍五入 |
|
|
122
|
+
| 2 | roundHalfEven |
|
|
123
|
+
| 3 | 向上取整 |
|
|
124
|
+
|
|
125
|
+
**Example / 示例**
|
|
126
|
+
|
|
127
|
+
```ts
|
|
128
|
+
// 千位分隔
|
|
129
|
+
formatNumber(1000) // '1,000'
|
|
130
|
+
formatNumber(1234567) // '1,234,567'
|
|
131
|
+
|
|
132
|
+
// 保留小数
|
|
133
|
+
formatNumber(1234.5678, { precision: 2 }) // '1,234.57'
|
|
134
|
+
|
|
135
|
+
// 自定义分隔符
|
|
136
|
+
formatNumber(1234567, { thousandSeparator: '-' }) // '1-234-567'
|
|
137
|
+
|
|
138
|
+
// 不同分隔位数
|
|
139
|
+
formatNumber(1234567, { bit: 4 }) // '123,4567'
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
### round
|
|
145
|
+
|
|
146
|
+
四舍五入(精度兼容)/ Round with precision
|
|
147
|
+
|
|
148
|
+
```ts
|
|
149
|
+
function round(m: BigSource, dp: number, rm?: RoundingMode): number
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
**Parameters / 参数**
|
|
153
|
+
|
|
154
|
+
| Name | Type | Default | Description |
|
|
155
|
+
|------|------|---------|-------------|
|
|
156
|
+
| `m` | `BigSource` | - | 数字 |
|
|
157
|
+
| `dp` | `number` | - | 保留位数 |
|
|
158
|
+
| `rm` | `RoundingMode` | `1` | 舍入模式 |
|
|
159
|
+
|
|
160
|
+
**Example / 示例**
|
|
161
|
+
|
|
162
|
+
```ts
|
|
163
|
+
// 四舍五入
|
|
164
|
+
round(5.23, 1) // 5.2
|
|
165
|
+
|
|
166
|
+
// 向上取整
|
|
167
|
+
round(5.23, 1, 3) // 5.3
|
|
168
|
+
|
|
169
|
+
// 向下取整
|
|
170
|
+
round(5.23, 1, 0) // 5.2
|
|
171
|
+
|
|
172
|
+
// 精度计算
|
|
173
|
+
round(0.1 + 0.2, 1) // 0.3
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## Use Cases / 使用场景
|
|
179
|
+
|
|
180
|
+
### 价格显示 / Price Display
|
|
181
|
+
|
|
182
|
+
```ts
|
|
183
|
+
// 商品价格
|
|
184
|
+
formatMoney(product.price)
|
|
185
|
+
|
|
186
|
+
// 订单金额
|
|
187
|
+
formatMoney(order.totalAmount)
|
|
188
|
+
|
|
189
|
+
// 用户余额
|
|
190
|
+
formatMoney(user.balance)
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### 数字格式化 / Number Formatting
|
|
194
|
+
|
|
195
|
+
```ts
|
|
196
|
+
// 统计数据
|
|
197
|
+
formatNumber(userCount) // '1,234'
|
|
198
|
+
|
|
199
|
+
// 精确小数
|
|
200
|
+
formatNumber(price, { precision: 2 }) // '1,234.56'
|
|
201
|
+
|
|
202
|
+
// 银行卡号
|
|
203
|
+
formatNumber(cardNumber, { bit: 4, thousandSeparator: ' ' }) // '1234 5678 9012 3456'
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### 精度计算 / Precision Calculation
|
|
207
|
+
|
|
208
|
+
```ts
|
|
209
|
+
// 金额计算
|
|
210
|
+
const total = useNumber(price)
|
|
211
|
+
.times(quantity)
|
|
212
|
+
.plus(shippingFee)
|
|
213
|
+
.minus(discount)
|
|
214
|
+
.toNumber()
|
|
215
|
+
|
|
216
|
+
// 比例计算
|
|
217
|
+
const percent = useNumber(value)
|
|
218
|
+
.div(total)
|
|
219
|
+
.times(100)
|
|
220
|
+
.round(2)
|
|
221
|
+
.toNumber()
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### 计数器动画 / Counter Animation
|
|
225
|
+
|
|
226
|
+
```ts
|
|
227
|
+
function animateCounter(target: number, duration: number = 1000) {
|
|
228
|
+
const start = 0
|
|
229
|
+
const startTime = Date.now()
|
|
230
|
+
|
|
231
|
+
const animate = () => {
|
|
232
|
+
const elapsed = Date.now() - startTime
|
|
233
|
+
const progress = Math.min(elapsed / duration, 1)
|
|
234
|
+
|
|
235
|
+
// 使用 easeOut 函数
|
|
236
|
+
const easeOut = 1 - Math.pow(1 - progress, 3)
|
|
237
|
+
const current = useNumber(target).times(easeOut).toNumber()
|
|
238
|
+
|
|
239
|
+
element.textContent = formatNumber(Math.round(current))
|
|
240
|
+
|
|
241
|
+
if (progress < 1) {
|
|
242
|
+
requestAnimationFrame(animate)
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
requestAnimationFrame(animate)
|
|
247
|
+
}
|
|
248
|
+
```
|