JS Deep Copy (v3)

Revision 3 of this benchmark created on


Description

Recursive deep copying vs. deep copying by serializing/de-serializing JSON. This only works if the object you're deep-copying can be serialized to JSON.

Preparation HTML

<script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/2.4.1/lodash.js"></script><script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>

Setup

function recursiveDeepCopy(o) {
      var newO,
        i;
    
      if (typeof o !== 'object') {
        return o;
      }
      if (!o) {
        return o;
      }
    
      if ('[object Array]' === Object.prototype.toString.apply(o)) {
        newO = [];
        for (i = 0; i < o.length; i += 1) {
          newO[i] = recursiveDeepCopy(o[i]);
        }
        return newO;
      }
    
      newO = {};
      for (i in o) {
        if (o.hasOwnProperty(i)) {
          newO[i] = recursiveDeepCopy(o[i]);
        }
      }
      return newO;
    }
    
    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
            }
          }
        }
      }]
    }]

Test runner

Ready to run.

Testing in
TestOps/sec
Recursive Deep Copy
var dimensionsCopy = recursiveDeepCopy(dimensions);
ready
JSON Deep Copy
var dimensionsCopy = jsonDeepCopy(dimensions);
ready
lodash clone
var dimensionsCopy = _.cloneDeep(dimensions);
ready
jQuery deep extend
var dimensionsCopy = $.extend(true, {}, dimensions);
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.