Skip to content

Instantly share code, notes, and snippets.

@FeMaffezzolli
Last active June 16, 2020 09:43
Show Gist options
  • Save FeMaffezzolli/9f35b5d9efb0f40d071911fa3dbc66f9 to your computer and use it in GitHub Desktop.
Save FeMaffezzolli/9f35b5d9efb0f40d071911fa3dbc66f9 to your computer and use it in GitHub Desktop.
Create an object from a flattenObject.
/**
* Creates an object from a flattenObject.
*
* @example
*
* Create following object:
*
* {
* address: {
* city: {
* name: 'São Paulo'
* },
* state: {
* name: 'SP'
* },
* street: {
* number: 123,
* name: 'Gustave Rapin'
* }
* }
* }
*
* From this object:
*
* {
* 'address.city.name': 'São Paulo',
* 'address.state.name': 'SP',
* 'address.street.number': 123,
* 'address.street.name': 'Gustave Rapin',
* }
*
* @param {object} input
* @param {stirng} divider
* @return {object}
*/
export function objectFromFlatten(input, divider = '.') {
const object = {}
const appendNestedField = (nests, name, value) => {
let pointer = object
if (nests && nests.length) {
nests.forEach((nest) => {
if (!pointer[nest]) {
pointer[nest] = {}
}
pointer = pointer[nest]
})
}
pointer[name] = value
}
Object.keys(input).forEach((key) => {
const nests = key.split(divider)
const name = nests.pop()
const value = input[key]
appendNestedField(nests, name, value)
})
return object
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment