Skip to content

Commit ce233ca

Browse files
committed
refactor(utils): add omit and get methods
1 parent 4272062 commit ce233ca

File tree

2 files changed

+44
-0
lines changed

2 files changed

+44
-0
lines changed

src/__tests__/utils.test.ts

+16
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import {
88
isString,
99
requestProxy,
1010
isObject,
11+
get,
12+
omit,
1113
} from '../core/utils';
1214
import limitTrigger from '../core/utils/limitTrigger';
1315
import fetchMock from 'fetch-mock';
@@ -162,4 +164,18 @@ describe('utils', () => {
162164
expect(error.message).toBe('Not Found');
163165
}
164166
});
167+
168+
test('get should work', () => {
169+
const object = { a: [{ b: { c: 3 } }] };
170+
171+
expect(get(object, 'a[0].b.c')).toBe(3);
172+
// => 3
173+
174+
expect(get(object, 'a.b.c', 'default')).toBe('default');
175+
});
176+
177+
test('omit should work', () => {
178+
const object = { a: 1, b: 2, c: 3 };
179+
expect(omit(object, ['a', 'b'])).toStrictEqual({ c: 3 });
180+
});
165181
});

src/core/utils/index.ts

+28
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,31 @@ export const requestProxy = async (...args: [url: string, ...rest: any[]]) => {
4949
}
5050
throw new Error(res.statusText);
5151
};
52+
53+
export const get = (
54+
source: Record<string, any>,
55+
path: string,
56+
defaultValue: any = undefined,
57+
) => {
58+
// a[3].b -> a.3.b
59+
const paths = path.replace(/\[(\d+)\]/g, '.$1').split('.');
60+
let result = source;
61+
for (const p of paths) {
62+
result = Object(result)[p];
63+
if (result === undefined) {
64+
return defaultValue;
65+
}
66+
}
67+
return result;
68+
};
69+
70+
export function omit<T, K extends keyof T>(
71+
object: T,
72+
keys: Array<K>,
73+
): Pick<T, Exclude<keyof T, K>> {
74+
const result = Object.assign({}, object);
75+
for (const key of keys) {
76+
delete result[key];
77+
}
78+
return result;
79+
}

0 commit comments

Comments
 (0)