Skip to content

Instantly share code, notes, and snippets.

@srishanbhattarai
Last active April 4, 2019 05:27
Show Gist options
  • Save srishanbhattarai/406490bf21d52c96591a8a6b3a309338 to your computer and use it in GitHub Desktop.
Save srishanbhattarai/406490bf21d52c96591a8a6b3a309338 to your computer and use it in GitHub Desktop.
JS Object Deep Flatten (ES6)
/**
* Flattens a nested object into a flat form delimited by "." character at
* each level. Check tests for an example.
*
* @param {Object} nestedObject
* @returns {Object}
*/
export const flattenObject = nestedObject => {
const flattenedObject = {}
const keys = Object.keys(nestedObject)
for (let i = 0; i < keys.length; i += 1) {
const key = keys[i]
const value = nestedObject[key]
if (value && typeof value === 'object') {
const innerValues = flattenObject(value)
const innerKeys = Object.keys(innerValues)
for (let j = 0; j < innerKeys.length; j += 1) {
const innerKey = innerKeys[j]
flattenedObject[`${key}.${innerKey}`] = innerValues[innerKey]
}
} else {
flattenedObject[key] = nestedObject[key]
}
}
return flattenedObject
}
// JEST
describe('flattenObject()', () => {
it('should correctly flatten the object', () => {
const originalObject = {
key1: {
key2: {
key3: 'val3',
key4: 'val4'
},
key5: 'val5'
},
key6: {
key7: 'val7'
},
key8: 'val8'
}
const expectedObject = {
'key1.key2.key3': 'val3',
'key1.key2.key4': 'val4',
'key1.key5': 'val5',
'key6.key7': 'val7',
key8: 'val8'
}
expect(flattenObject(originalObject)).toEqual(expectedObject)
})
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment