From 09854730b72d3156c230edb66fea61e81fdb0393 Mon Sep 17 00:00:00 2001 From: Kamaal Farah Date: Mon, 20 May 2024 13:16:15 +0200 Subject: [PATCH] Adding flatten objects --- src/objects/flatten.test.ts | 23 +++++++++++++++++++++++ src/objects/flatten.ts | 24 ++++++++++++++++++++++++ src/objects/index.ts | 1 + 3 files changed, 48 insertions(+) create mode 100644 src/objects/flatten.test.ts create mode 100644 src/objects/flatten.ts diff --git a/src/objects/flatten.test.ts b/src/objects/flatten.test.ts new file mode 100644 index 0000000..83dc037 --- /dev/null +++ b/src/objects/flatten.test.ts @@ -0,0 +1,23 @@ +import flatten from './flatten'; + +describe('flatten', () => { + it('flattens the given object', () => { + const nestedObject = { + hello: { + yes: 'true', + }, + flat: 'yes', + nested: { + array: [1, 2], + }, + }; + + const result = flatten(nestedObject); + + expect(result).toEqual({ + 'hello.yes': 'true', + flat: 'yes', + 'nested.array': [1, 2], + }); + }); +}); diff --git a/src/objects/flatten.ts b/src/objects/flatten.ts new file mode 100644 index 0000000..3a4b230 --- /dev/null +++ b/src/objects/flatten.ts @@ -0,0 +1,24 @@ +function _flatten( + obj: Record, + recursiveContext?: { parentKey: string; result: Result } +): Result { + const initialResult = recursiveContext?.result ?? ({} as unknown as Result); + const parentKey = recursiveContext?.parentKey; + + return Object.entries(obj).reduce((acc, [key, value]) => { + const newKey = parentKey != null ? `${parentKey}.${key}` : key; + if (typeof value !== 'object') return { ...acc, [newKey]: value }; + if (Array.isArray(value)) return { ...acc, [newKey]: value }; + + return _flatten(value as Record, { + parentKey: newKey, + result: acc, + }); + }, initialResult); +} + +function flatten(obj: Record): Result { + return _flatten(obj); +} + +export default flatten; diff --git a/src/objects/index.ts b/src/objects/index.ts index 66cb60c..e172786 100644 --- a/src/objects/index.ts +++ b/src/objects/index.ts @@ -1,2 +1,3 @@ export * from './omit'; export * from './omitBy'; +export * from './flatten';