Skip to content

Commit 928b90f

Browse files
author
Simon he
committed
feature: add new function
1 parent 1d5ceef commit 928b90f

File tree

15 files changed

+136
-19
lines changed

15 files changed

+136
-19
lines changed

README.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,13 @@
22
- deepCompare // 比较2个对象的差异返回不同的属性和具体不同的值
33
- deepMerge // Object.assign的深度拷贝版本,返回合并后传入的第一个对象
44
- asyncPool // limit:控制异步并发执行的数量,tasks:异步任务数组
5-
- quickFind // quickFind(array: any[], key: any),返回一个新的实例,在实例中find方法可以根据key查找对应的项,查找效率O(1),set更新或新增项,delete删除项
5+
- quickFind // quickFind(array: any[], key: any),返回一个新的实例,在实例中find方法可以根据key查找对应的项,查找效率O(1),set更新或新增项,delete删除项效率都是O(1)
66
- quickFilter // quickFilter(array: any[], key: string | number | Array<string | number>, value: string | number | RegExp), 快速模糊查找key名字的项,支持正则匹配
7+
- deepClone // 简洁的深拷贝
8+
- curry // 函数柯里化
9+
- memorizeFn // 根据参数返回一个有缓存的函数
10+
- debounce // 函数防抖
11+
- throttle // 函数节流
712

813
## 使用方法
914
### deepMerge
@@ -16,3 +21,10 @@
1621
![quickFind](assets/quickFind.png)
1722
### quickFilter
1823
![quickFilter](assets/quickFilter.png)
24+
### deepClone
25+
![deepClone](assets/deepClone.png)
26+
### curry
27+
![curry](assets/curry.png)
28+
### memorizeFn
29+
![memorizeFn](assets/memorizeFn.png)
30+

assets/curry.png

16.2 KB
Loading

assets/deepClone.png

58.1 KB
Loading

assets/memorizeFn.png

16.2 KB
Loading

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,6 @@
5757
"eslint-plugin-n": "^15.2.1",
5858
"pkgroll": "^1.3.1",
5959
"typescript": "^4.7.2",
60-
"vitest": "^0.13.1"
60+
"vitest": "^0.14.2"
6161
}
6262
}

pnpm-lock.yaml

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/common.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
const _toString = Object.prototype.toString
22

3-
export function isPlainObject(obj: any) {
3+
export function isPlainObject(obj: any): boolean {
44
return _toString.call(obj) === '[object Object]'
55
}

src/curry.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
export function curry(f: Function) {
2+
const g = (...args: any[]) => {
3+
if (args.length >= f.length)
4+
return f(...args)
5+
6+
return (...more: any[]) => {
7+
return g(...args, ...more)
8+
}
9+
}
10+
return g
11+
}

src/debounce.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
export function debounce(fn: Function, time: number) {
2+
let timer: any = null
3+
return function (this: any, e?: any) {
4+
if (timer !== null)
5+
clearTimeout(timer)
6+
setTimeout(() => {
7+
const result = fn.call(this, e)
8+
timer = null
9+
return result
10+
}, time)
11+
}
12+
}

src/deepClone.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
const types = [Set, Map, WeakMap, WeakSet, RegExp, Date]
2+
const targetMap = new WeakMap()
3+
export function deepClone(target: any) {
4+
if (targetMap.has(target))
5+
return targetMap.get(target)
6+
if (typeof target === 'function' || target === null)
7+
return target
8+
if (types.includes(target.constructor))
9+
return new target.constructor(target)
10+
if (typeof target !== 'object')
11+
return target
12+
const cloneObj = Object.create(Object.getPrototypeOf(target), Object.getOwnPropertyDescriptors(target))
13+
targetMap.set(target, cloneObj)
14+
for (const key of Reflect.ownKeys(target)) {
15+
if (typeof target[key] === 'object')
16+
cloneObj[key] = deepClone(target[key])
17+
else
18+
cloneObj[key] = target[key]
19+
}
20+
return cloneObj
21+
}

0 commit comments

Comments
 (0)