Skip to content

Commit 336cd12

Browse files
author
Simon he
committed
feature: add traverse
1 parent 929f171 commit 336cd12

File tree

6 files changed

+98
-2
lines changed

6 files changed

+98
-2
lines changed

.eslintrc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"extends": "@antfu",
33
"rules": {
4-
"vue/one-component-per-file": "off"
4+
"vue/one-component-per-file": "off",
5+
"no-console": "off"
56
}
67
}

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@
99
- memorizeFn // 根据参数返回一个有缓存的函数
1010
- debounce // 函数防抖
1111
- throttle // 函数节流
12+
- traverse // 遍历对象或数组,快速从options中得到指定的属性值,traverse(arr, {
13+
'family.name'(target: any, index: number) {
14+
console.log(target, index,)
15+
}
16+
})
1217

1318
## 使用方法
1419
### deepMerge
@@ -27,4 +32,6 @@
2732
![curry](assets/curry.png)
2833
### memorizeFn
2934
![memorizeFn](assets/memorizeFn.png)
35+
### traverse
36+
![traverse](assets/traverse.png)
3037

assets/traverse.png

76.6 KB
Loading

src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ export { curry } from './curry'
99
export { memorizeFn } from './memorizeFn'
1010
export { debounce } from './debounce'
1111
export { throttle } from './throttle'
12+
export { traverse } from './traverse'

src/traverse.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
export function traverse(target: Record<any, any> | any[], options: Record<string, Function> = {}) {
2+
if (typeof target !== 'object')
3+
return target
4+
Array.isArray(target)
5+
? target.forEach((item, index) => executor(item, index, options))
6+
: executor(target, 0, options)
7+
return target
8+
}
9+
10+
function executor(target: Record<any, any>, index: number, options: Record<string, Function> = {}) {
11+
for (const key in options) {
12+
const result = key.split('.').reduce((_, cur) => {
13+
return target[cur]
14+
}, '')
15+
options[key](result, index, target)
16+
}
17+
}
18+

test/basic.test.ts

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { describe, expect, it } from 'vitest'
2-
import { asyncPool, curry, deepClone, deepCompare, deepMerge, memorizeFn, quickFilter, quickFind } from '../src'
2+
import { asyncPool, curry, deepClone, deepCompare, deepMerge, memorizeFn, quickFilter, quickFind, traverse } from '../src'
33

44
describe('Test 1', () => {
55
it('deepMerge test', () => {
@@ -332,3 +332,72 @@ describe('Test 8', () => {
332332
})
333333
})
334334

335+
describe('Test 9', () => {
336+
it('traverse test', async () => {
337+
const arr = [
338+
{
339+
name: 'simon',
340+
family: {
341+
bro: 'simonBro',
342+
},
343+
people: {
344+
name: 'simonPeople',
345+
family: {
346+
bro: 'simonPeopleBro',
347+
},
348+
},
349+
}, {
350+
name: 'kitty',
351+
family: {
352+
bro: 'kittyBro',
353+
},
354+
people: {
355+
name: 'kittyPeople',
356+
family: {
357+
bro: 'kittyPeopleBro',
358+
},
359+
},
360+
},
361+
]
362+
expect(traverse(arr, {
363+
'family.name': function (target: any, index: number) {
364+
console.log(target, index)
365+
},
366+
people(target: any, index: number) {
367+
target.name = 'haha'
368+
console.log(target, index)
369+
},
370+
'people.family': function (target: any, index: number, item: any) {
371+
console.log(target, index, item)
372+
},
373+
})).toMatchInlineSnapshot(`
374+
[
375+
{
376+
"family": {
377+
"bro": "simonBro",
378+
},
379+
"name": "simon",
380+
"people": {
381+
"family": {
382+
"bro": "simonPeopleBro",
383+
},
384+
"name": "haha",
385+
},
386+
},
387+
{
388+
"family": {
389+
"bro": "kittyBro",
390+
},
391+
"name": "kitty",
392+
"people": {
393+
"family": {
394+
"bro": "kittyPeopleBro",
395+
},
396+
"name": "haha",
397+
},
398+
},
399+
]
400+
`)
401+
})
402+
})
403+

0 commit comments

Comments
 (0)