Skip to content

Commit e575d10

Browse files
committed
add pick function
1 parent ea6698f commit e575d10

File tree

3 files changed

+51
-7
lines changed

3 files changed

+51
-7
lines changed

src/omit.ts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
1-
export default function omit<T extends object, K extends keyof T>(
2-
obj: T,
1+
const omit = <T extends object, K extends keyof T>(
2+
oriObj: T,
33
fields: K[] | readonly K[],
4-
): Omit<T, K> {
5-
const clone = Object.assign({}, obj);
4+
): Omit<T, K> => {
5+
if (!oriObj) {
6+
return {} as Omit<T, K>;
7+
}
8+
9+
const clone = Object.assign({}, oriObj);
610

711
if (Array.isArray(fields)) {
8-
fields.forEach(key => {
12+
for (const key in fields) {
913
delete clone[key];
10-
});
14+
}
1115
}
1216

1317
return clone;
14-
}
18+
};
19+
20+
export default omit;

src/pick.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
const pick = <T extends object, K extends keyof T>(
2+
oriObj: T,
3+
fields: K[] | readonly K[],
4+
): Pick<T, K> => {
5+
if (!oriObj) {
6+
return {} as Pick<T, K>;
7+
}
8+
9+
const result = {} as Pick<T, K>;
10+
11+
if (Array.isArray(fields)) {
12+
for (const key of fields) {
13+
result[key] = oriObj[key];
14+
}
15+
}
16+
17+
return result;
18+
};
19+
20+
export default pick;

tests/pick.test.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import pick from '../src/pick';
2+
3+
describe('omit', () => {
4+
it('should work', () => {
5+
const ret = pick({ a: 1, b: 2, c: 3 }, ['a']);
6+
expect(ret).toEqual({ a: 1 });
7+
});
8+
9+
it('invalidate array', () => {
10+
const ret = pick({ bamboo: 1 }, null);
11+
expect(ret).toEqual({});
12+
});
13+
14+
it('readonly array', () => {
15+
const ret = pick({ a: 1, b: 2 }, ['b'] as const);
16+
expect(ret).toEqual({ b: 2 });
17+
});
18+
});

0 commit comments

Comments
 (0)