Created
November 9, 2017 18:31
-
-
Save evenfrost/87d7900476c8e3ff7482fc01b0064c26 to your computer and use it in GitHub Desktop.
Convert sequelize v4 query response to plain objects preserving all types and associations
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const toPlain = response => { | |
const flattenDataValues = ({ dataValues }) => | |
_.mapValues(dataValues, value => ( | |
_.isArray(value) && _.isObject(value[0]) && _.isObject(value[0].dataValues) | |
? _.map(value, flattenDataValues) | |
: _.isObject(value) && _.isObject(value.dataValues) | |
? flattenDataValues(value) | |
: value | |
)); | |
return _.isArray(response) ? _.map(response, flattenDataValues) : flattenDataValues(response); | |
}; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const toPlain = response => { | |
const flattenDataValues = ({ dataValues }) => { | |
const flattenedObject = {}; | |
Object.keys(dataValues).forEach(key => { | |
const dataValue = dataValues[key]; | |
if ( | |
Array.isArray(dataValue) && | |
dataValue[0] && | |
dataValue[0].dataValues && | |
typeof dataValue[0].dataValues === 'object' | |
) { | |
flattenedObject[key] = dataValues[key].map(flattenDataValues); | |
} else if (dataValue && dataValue.dataValues && typeof dataValue.dataValues === 'object') { | |
flattenedObject[key] = flattenDataValues(dataValues[key]); | |
} else { | |
flattenedObject[key] = dataValues[key]; | |
} | |
}); | |
return flattenedObject; | |
}; | |
return Array.isArray(response) ? response.map(flattenDataValues) : flattenDataValues(response); | |
}; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const res = await User.findAll({ | |
include: [{ | |
model: Company, | |
as: 'companies', | |
include: [{ | |
model: Member, | |
as: 'member', | |
}], | |
}], | |
}); | |
const plain = toPlain(res); | |
// 'plain' now contains simple db object without any getters/setters with following structure: | |
// [{ | |
// id: 123, | |
// name: 'John', | |
// companies: [{ | |
// id: 234, | |
// name: 'Google', | |
// members: [{ | |
// id: 345, | |
// name: 'Paul', | |
// }] | |
// }] | |
// }] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment