Run details:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36
Chrome 90
Windows
Desktop
3 years ago
Test name Executions per second
Recursive Deep Copy 243328.9 Ops/sec
JSON Deep Copy 33040.2 Ops/sec
lodash clone 15790.5 Ops/sec
c7x43t 5772.3 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
 
// deep copy:
// String, Number, undefined, null, Set, Map, typed Array, Object, Boolean, RegExp, Date, ArrayBuffer
// Functions, Properties of types: (Primitive, Symbol)
// shallow copy (by reference):
// WeakMap, WeakSet, Symbol
function deepCopy(o) {
    if ((typeof o !== "object" || o === null) && !(o instanceof Function)) return o; // fast obj/null test
    let n, keys;
    const c = o.constructor;
    if (o[Symbol.iterator] instanceof Function) { // fast array test
        // Map and Set have no length property so they will be correctly constructed
        const l = o.length;
        n = (new c(l));
        switch (c) {
            case Set:
                for (let e of o) n.add(deepCopy(e));
                break;
            case Map:
                for (let [key, value] of o) n.set(key, deepCopy(value));
                break;
        }
        for (let i of Object.keys(o)) n[i] = deepCopy(o[i]);
    } else {
        if (c !== Object) {
            switch (c) {
                case Function:
                    let str = o.toString();
                    if(/ \[native code\] /.exec(str) === null){
                        let args=/^.*?\((.*?)\)/.exec(str)[1];//.split(/,/);
                        let func=/^.*?{(.*)}/.exec(str)[1];
                        n=new c(args,func);
                    }else{
                        n=o;
                    }
                    break;
                case RegExp:
                    n = new c(o.valueOf());
                    break;
                case Date:
                    n = new c(o);
                    break;
                case ArrayBuffer:
                    n = new c((new Int8Array(o)).length);
                    break;
                default:
                    n = o;
            }
            keys = Object.keys(o);
        } else {
            n = {};
            keys = Object.getOwnPropertyNames(o);
        }
        for (let i of keys) n[i] = deepCopy(o[i]);
    }
    for (let i of Object.getOwnPropertySymbols(o)) n[i] = deepCopy(o[i]);
    return n;
}
function recursiveDeepCopy(obj) {
  return Object.keys(obj).reduce((v, d) => Object.assign(v, {
    [d]: (obj[d].constructor === Object) ? recursiveDeepCopy(obj[d]) : obj[d]
  }), {});
}
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);
  • c7x43t

     
    var dimensionsCopy = deepCopy(dimensions);