Skip to content

Instantly share code, notes, and snippets.

@juliarose
Created May 17, 2019 22:04
Show Gist options
  • Select an option

  • Save juliarose/9afb9fc221e098b599aad57f65a59435 to your computer and use it in GitHub Desktop.

Select an option

Save juliarose/9afb9fc221e098b599aad57f65a59435 to your computer and use it in GitHub Desktop.

Revisions

  1. juliarose created this gist May 17, 2019.
    59 changes: 59 additions & 0 deletions transformObj.js
    Original 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;
    }, {});
    }