Created
May 17, 2019 22:04
-
-
Save juliarose/9afb9fc221e098b599aad57f65a59435 to your computer and use it in GitHub Desktop.
Revisions
-
juliarose created this gist
May 17, 2019 .There are no files selected for viewing
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 charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,59 @@ /** * Recursively transform key/values in object, including array values * * Also can act as a basic deep clone method * @param {Object} obj - Object to transform * @param {Object} [transforms={}] - Object containing transformation functions * @param {Function} [transform.keys] - Function for transforming keys from 'obj' * @param {Function} [transform.values] - Function for transforming values from 'obj' * @param {Number} [level=0] - Level of recursion, passed as the 2nd argument to a transform function * @returns {Object} Transformed object * * @example * transformObj({ * apple: 'Green', * orange: 'Orange', * cherry: { * color: 'Red' * } * }, { * keys: (key, level) => { * return level === 0 ? `fruit_${key}` : key; * }, * values: (value) => { * return value.toUpperCase(); * } * }); // { fruit_apple: 'GREEN', fruit_orange: 'ORANGE', fruit_cherry: { color: 'RED' } } */ function transformObj(obj, transforms = {}, level = 0) { if (typeof obj !== 'object' || obj === null) { // nothing we can do return obj; } function convertValue(value) { if (Array.isArray(value)) { return value.map(convertValue); } else if (typeof value === 'object') { return transformObj(value, transforms, level + 1); } else if (transforms.values) { // transform value return transforms.values(value, level); } else { return value; } } return Object.keys(obj).reduce((result, key) => { let value = obj[key]; if (transforms.keys) { // transform key key = transforms.keys(key, level); } result[key] = convertValue(value); return result; }, {}); }