Run details:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36
Chrome 68
Mac OS X 10.13.6
Desktop
6 years ago
Test name Executions per second
Recursive Deep Copy 246262.8 Ops/sec
JSON Deep Copy 36625.5 Ops/sec
lodash clone 22184.7 Ops/sec
cloneDeep 28056.7 Ops/sec
cloneDeep2 22936.9 Ops/sec
cloneDeep3 9251.2 Ops/sec
HTML Preparation code:
AخA
 
1
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.js"></script> <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
Script Preparation code:
x
 
function recursiveDeepCopy(obj) {
  return Object.keys(obj).reduce((v, d) => Object.assign(v, {
    [d]: (obj[d].constructor === Object) ? recursiveDeepCopy(obj[d]) : obj[d]
  }), {});
}
function cloneDeep(objSource) {
    if (typeof objSource !== 'object' || objSource === null) {
        return objSource;
    }
    return cloneDeepRecursive(objSource);
    
};
function cloneDeepRecursive(objSource) {
  let objTarget = Array.isArray(objSource) ? [] : {};
    let keys = Object.keys(objSource);
    keys.forEach(key => {
        let value = objSource[key];
        if (value === null) {
            objTarget[key] = null;
        } else if (typeof value === 'object') {
            objTarget[key] = cloneDeepRecursive(value);
        } else {
            objTarget[key] = value;
        }
    });
    return objTarget;
}
function cloneDeep2(objSource) {
    if (typeof objSource !== 'object' || objSource === null) {
        return objSource;
    }
    let keys = Object.keys(objSource);
    return keys.reduce((objTarget, key) => {
        let value = objSource[key];
        if (value === null || typeof value !== 'object') {
            objTarget[key] = value;
        } else {
            objTarget[key] = cloneDeep2(value);
        }
        return objTarget;
    }, Array.isArray(objSource) ? [] : {});
};
function cloneDeep3(objSource) {
    if (objSource === null || typeof objSource !== 'object') {
        return objSource;
    }
    return cloneDeep2Recursive(objSource);
};
function cloneDeep2Recursive(objSource) {
    return Object.keys(objSource).reduce((objTarget, key) => {
        return Object.assign(objTarget, {
            [key]: (objSource[key] === null || typeof objSource[key] !== 'object') ? objSource[key] : cloneDeep2Recursive(objSource[key])
        });
    }, Array.isArray(objSource) ? [] : {});
};
function jsonDeepCopy(o) {
  return JSON.parse(JSON.stringify(o));
}
var dimensions = [{
  "dimensions": [{
    "runtime": {
      "common": {
        "client": null,
        "server": null
      }
    }
  }, {
    "device": {
      "android": null,
      "blackberry": null,
      "iemobile": null,
      "iphone": null,
      "ipad": null,
      "kindle": null,
      "opera-mini": null,
      "palm": null
    }
  }, {
    "environment": {
      "development": {
        "dev": null,
        "test": null
      },
      "production": {
        "stage": null,
        "prod": null
      }
    }
  }, {
    "lang": {
      "ar": {
        "ar-JO": null,
        "ar-MA": null,
        "ar-SA": null,
        "ar-EG": null
      },
      "bn": {
        "bn-IN": null
      },
      "ca": {
        "ca-ES": null
      },
      "cs": {
        "cs-CZ": null
      },
      "da": {
        "da-DK": null
      },
      "de": {
        "de-AT": null,
        "de-DE": null
      },
      "el": {
        "el-GR": null
      },
      "en": {
        "en-AU": null,
        "en-BG": null,
        "en-CA": null,
        "en-GB": null,
        "en-GY": null,
        "en-HK": null,
        "en-IE": null,
        "en-IN": null,
        "en-MY": null,
        "en-NZ": null,
        "en-PH": null,
        "en-SG": null,
        "en-US": null,
        "en-ZA": null
      },
      "es": {
        "es-AR": null,
        "es-BO": null,
        "es-CL": null,
        "es-CO": null,
        "es-EC": null,
        "es-ES": null,
        "es-MX": null,
        "es-PE": null,
        "es-PY": null,
        "es-US": null,
        "es-UY": null,
        "es-VE": null
      },
      "fi": {
        "fi-FI": null
      },
      "fr": {
        "fr-BE": null,
        "fr-CA": null,
        "fr-FR": null,
        "fr-GF": null
      },
      "hi": {
        "hi-IN": null
      },
      "hu": {
        "hu-HU": null
      },
      "id": {
        "id-ID": null
      },
      "it": {
        "it-IT": null
      },
      "ja": {
        "ja-JP": null
      },
      "kn": {
        "kn-IN": null
      },
      "ko": {
        "ko-KR": null
      },
      "ml": {
        "ml-IN": null
      },
      "mr": {
        "mr-IN": null
      },
      "ms": {
        "ms-MY": null
      },
      "nb": {
        "nb-NO": null
      },
      "nl": {
        "nl-BE": null,
        "nl-NL": null,
        "nl-SR": null
      },
      "pl": {
        "pl-PL": null
      },
      "pt": {
        "pt-BR": null
      },
      "ro": {
        "ro-RO": null
      },
      "ru": {
        "ru-RU": null
      },
      "sv": {
        "sv-SE": null
      },
      "ta": {
        "ta-IN": null
      },
      "te": {
        "te-IN": null
      },
      "th": {
        "th-TH": null
      },
      "tr": {
        "tr-TR": null
      },
      "vi": {
        "vi-VN": null
      },
      "zh": {
        "zh-Hans": {
          "zh-Hans-CN": null
        },
        "zh-Hant": {
          "zh-Hant-HK": null,
          "zh-Hant-TW": null
        }
      }
    }
  }]
}]
Tests:
  • Recursive Deep Copy

     
    var dimensionsCopy = recursiveDeepCopy(dimensions);
  • JSON Deep Copy

     
    var dimensionsCopy = jsonDeepCopy(dimensions);
  • lodash clone

     
    var dimensionsCopy = _.cloneDeep(dimensions);
  • cloneDeep

     
    var dimensionsCopy = cloneDeep(dimensions);
  • cloneDeep2

     
    var dimensionsCopy = cloneDeep2(dimensions);
  • cloneDeep3

     
    var dimensionsCopy = cloneDeep3(dimensions);