diff --git a/src/object.ts b/src/object.ts index 195808b6..2cdda959 100644 --- a/src/object.ts +++ b/src/object.ts @@ -323,11 +323,26 @@ export const keys = (value: TValue): string[] => { */ export const crush = (value: TValue): object => { if (!value) return {} - return objectify( - keys(value), - k => k, - k => get(value, k) - ) + const crushImpl = ( + nested: any, + paths: string[], + result: Record + ): void => { + if (isObject(nested)) { + for (const [k, v] of Object.entries(nested)) { + crushImpl(v, [...paths, k], result) + } + } else if (isArray(nested)) { + for (let i = 0; i < nested.length; i++) { + crushImpl(nested[i], [...paths, `${i}`], result) + } + } else { + result[paths.join('.')] = nested + } + } + const result: Record = {} + crushImpl(value, [], result) + return result } /** diff --git a/src/tests/object.test.ts b/src/tests/object.test.ts index 2f521a4e..d6bd998e 100644 --- a/src/tests/object.test.ts +++ b/src/tests/object.test.ts @@ -575,6 +575,18 @@ describe('object module', () => { timestamp: now }) }) + test('preserves values when object keys contain dots', () => { + const obj = { + key1: { + key2: 'value' + }, + 'bar.baz': 'fiz' + } + assert.deepEqual(_.crush(obj), { + 'key1.key2': 'value', + 'bar.baz': 'fiz' + }) + }) }) describe('construct function', () => {