From 3daa47dc83e22da1f54b7ae80d0224cfadc38a3b Mon Sep 17 00:00:00 2001 From: robonen Date: Thu, 31 Oct 2024 00:48:01 +0700 Subject: [PATCH] feat(packages/stdlib): add omit object tool --- .../stdlib/src/objects/omit/index.test.ts | 50 +++++++++++++++++++ packages/stdlib/src/objects/omit/index.ts | 38 ++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 packages/stdlib/src/objects/omit/index.test.ts create mode 100644 packages/stdlib/src/objects/omit/index.ts diff --git a/packages/stdlib/src/objects/omit/index.test.ts b/packages/stdlib/src/objects/omit/index.test.ts new file mode 100644 index 0000000..c086a89 --- /dev/null +++ b/packages/stdlib/src/objects/omit/index.test.ts @@ -0,0 +1,50 @@ +import { describe, it, expect } from 'vitest'; +import { omit } from '.'; + +describe('omit', () => { + it('omit a single key from the object', () => { + const result = omit({ a: 1, b: 2, c: 3 }, 'a'); + + expect(result).toEqual({ b: 2, c: 3 }); + }); + + it('omit multiple keys from the object', () => { + const result = omit({ a: 1, b: 2, c: 3 }, ['a', 'b']); + + expect(result).toEqual({ c: 3 }); + }); + + it('return the same object if no keys are omitted', () => { + const result = omit({ a: 1, b: 2, c: 3 }, []); + + expect(result).toEqual({ a: 1, b: 2, c: 3 }); + }); + + it('not modify the original object', () => { + const obj = { a: 1, b: 2, c: 3 }; + const result = omit(obj, 'a'); + + expect(obj).toEqual({ a: 1, b: 2, c: 3 }); + expect(result).toEqual({ b: 2, c: 3 }); + }); + + it('handle an empty object', () => { + const result = omit({}, 'a' as any); + + expect(result).toEqual({}); + }); + + it('handle non-existent keys gracefully', () => { + const result = omit({ a: 1, b: 2, c: 3 } as Record, 'd'); + + expect(result).toEqual({ a: 1, b: 2, c: 3 }); + }); + + it('handle null gracefully', () => { + const emptyTarget = omit(null as any, 'a'); + const emptyKeys = omit({ a: 1 }, null as any); + + expect(emptyTarget).toEqual({}); + expect(emptyKeys).toEqual({ a: 1 }); + }); +}); \ No newline at end of file diff --git a/packages/stdlib/src/objects/omit/index.ts b/packages/stdlib/src/objects/omit/index.ts new file mode 100644 index 0000000..840147c --- /dev/null +++ b/packages/stdlib/src/objects/omit/index.ts @@ -0,0 +1,38 @@ +import { isArray, type Arrayable } from '../../types'; + +/** + * @name omit + * @category Objects + * @description Returns a new object with the specified keys omitted + * + * @param {object} target - The object to omit keys from + * @param {Arrayable} keys - The keys to omit + * @returns {Omit} The new object with the specified keys omitted + * + * @example + * omit({ a: 1, b: 2, c: 3 }, 'a') // => { b: 2, c: 3 } + * + * @example + * omit({ a: 1, b: 2, c: 3 }, ['a', 'b']) // => { c: 3 } + * + * @since 0.0.3 + */ +export function omit( + target: Target, + keys: Arrayable +): Omit { + const result = { ...target }; + + if (!target || !keys) + return result; + + if (isArray(keys)) { + for (const key of keys) { + delete result[key]; + } + } else { + delete result[keys]; + } + + return result; +}