v1
4/29/2020 by Lamik 4/30/202000
disable setup HTML
Setup HTML
<script src="https://code.jquery.com/jquery-3.5.0.min.js" integrity="sha256-xNzN2a4ltkB44Mc/Jz3pT4iU1cmeR0FkXs4pru/JxaQ=" crossorigin="anonymous"></script>

<!-- lodash library is included by default -->
disable setup JavaScript
Setup JavaScript
function getField(k) {
  let i=k%10;
  if(i==0) return false;
  if(i==1) return true;
  if(i==2) return k;
  if(i==3) return 0;
  if(i==4) return null;
  if(i==5) return [];
  if(i==6) return {};  
  if(i>=7) return "text"+k;
}

let obj = Array(1000).fill(0).reduce((a,c,i) => (a['field'+i]=getField(i),a) ,{})
delete caserun single casemove downdrag and drop case


ready



function A(obj) {
  return {...obj}
}

A(obj);
delete caserun single casemove upmove downdrag and drop case


ready



function B(obj) {
  return Object.assign({}, obj); 
}

B(obj);
delete caserun single casemove upmove downdrag and drop case


ready



function C(obj) {
  return Object.keys(obj).reduce( (a,c) => (a[c]=obj[c], a), {})
}

C(obj);
delete caserun single casemove upmove downdrag and drop case


ready



function D(obj) {
  let copyOfObject = {};
  Object.defineProperties(copyOfObject, Object.getOwnPropertyDescriptors(obj));
  return copyOfObject;
}

D(obj);
delete caserun single casemove upmove downdrag and drop case


ready



function E(obj) {
  return jQuery.extend({}, obj) // shallow
}

E(obj);
delete caserun single casemove upmove downdrag and drop case


ready



function F(obj) {
  return _.clone(obj);
}

F(obj);
delete caserun single casemove upmove downdrag and drop case


ready



function G(obj) {
  return _.clone(obj,true);
}

G(obj);
delete caserun single casemove upmove downdrag and drop case


ready



function H(obj) {
  return _.extend({},obj);
}

H(obj);
delete caserun single casemove upmove downdrag and drop case


ready



function I(obj) {
    if (null == obj || "object" != typeof obj) return obj;
    var copy = obj.constructor();
    for (var attr in obj) {
        if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
    }
    return copy;
}

I(obj);
delete caserun single casemove upmove downdrag and drop case


ready



function J(obj) {
  return _.cloneDeep(obj,true);
}

J(obj);
delete caserun single casemove upmove downdrag and drop case


ready



function K(obj) {
	return JSON.parse(JSON.stringify(obj));
}

K(obj);
delete caserun single casemove upmove downdrag and drop case


ready



function L(obj) {
  return jQuery.extend(true, {}, obj) // deep
}

L(obj);
delete caserun single casemove upmove downdrag and drop case


ready



function M(obj) {
  if(obj == null || typeof(obj) != 'object')
    return obj;    
  var temp = new obj.constructor(); 
  for(var key in obj)
    temp[key] = M(obj[key]);    
  return temp;
}

M(obj);
delete caserun single casemove upmove downdrag and drop case


ready



function N(obj) {
  let EClone = function(obj) {
    var newObj = (obj instanceof Array) ? [] : {};
    for (var i in obj) {
      if (i == 'EClone') continue;
      if (obj[i] && typeof obj[i] == "object") {
        newObj[i] = EClone(obj[i]);
      } else newObj[i] = obj[i]
    } return newObj;
  };

	return EClone(obj);
};

N(obj);
delete caserun single casemove upmove downdrag and drop case


ready



function O(obj) {
    if (obj == null || typeof obj != "object") return obj;
    if (obj.constructor != Object && obj.constructor != Array) return obj;
    if (obj.constructor == Date || obj.constructor == RegExp || obj.constructor == Function ||
        obj.constructor == String || obj.constructor == Number || obj.constructor == Boolean)
        return new obj.constructor(obj);

    let to = new obj.constructor();

    for (var name in obj)
    {
        to[name] = typeof to[name] == "undefined" ? O(obj[name], null) : to[name];
    }

    return to;
}

O(obj);
delete caserun single casemove upmove downdrag and drop case


ready



function P(obj) {
  function clone(target, source){

      for(let key in source){

          // Use getOwnPropertyDescriptor instead of source[key] to prevent from trigering setter/getter.
          let descriptor = Object.getOwnPropertyDescriptor(source, key);
          if(descriptor.value instanceof String){
              target[key] = new String(descriptor.value);
          }
          else if(descriptor.value instanceof Array){
              target[key] = clone([], descriptor.value);
          }
          else if(descriptor.value instanceof Object){
              let prototype = Reflect.getPrototypeOf(descriptor.value);
              let cloneObject = clone({}, descriptor.value);
              Reflect.setPrototypeOf(cloneObject, prototype);
              target[key] = cloneObject;
          }
          else {
              Object.defineProperty(target, key, descriptor);
          }
      }
      let prototype = Reflect.getPrototypeOf(source);
      Reflect.setPrototypeOf(target, prototype);
      return target;
  }
  return clone({},obj);
}

P(obj);
delete caserun single casemove upmove downdrag and drop case


ready



function Q(obj) {
    var copy;

    // Handle the 3 simple types, and null or undefined
    if (null == obj || "object" != typeof obj) return obj;

    // Handle Date
    if (obj instanceof Date) {
        copy = new Date();
        copy.setTime(obj.getTime());
        return copy;
    }

    // Handle Array
    if (obj instanceof Array) {
        copy = [];
        for (var i = 0, len = obj.length; i < len; i++) {
            copy[i] = Q(obj[i]);
        }
        return copy;
    }

    // Handle Object
    if (obj instanceof Object) {
        copy = {};
        for (var attr in obj) {
            if (obj.hasOwnProperty(attr)) copy[attr] = Q(obj[attr]);
        }
        return copy;
    }

    throw new Error("Unable to copy obj! Its type isn't supported.");
}

Q(obj);
delete caserun single casemove upmove downdrag and drop case


ready



function R(obj) {
    const gdcc = "__getDeepCircularCopy__";
    if (obj !== Object(obj)) {
        return obj; // primitive value
    }

    var set = gdcc in obj,
        cache = obj[gdcc],
        result;
    if (set && typeof cache == "function") {
        return cache();
    }
    // else
    obj[gdcc] = function() { return result; }; // overwrite
    if (obj instanceof Array) {
        result = [];
        for (var i=0; i<obj.length; i++) {
            result[i] = R(obj[i]);
        }
    } else {
        result = {};
        for (var prop in obj)
            if (prop != gdcc)
                result[prop] = R(obj[prop]);
            else if (set)
                result[prop] = R(cache);
    }
    if (set) {
        obj[gdcc] = cache; // reset
    } else {
        delete obj[gdcc]; // unset again
    }
    return result;
}

R(obj);
delete caserun single casemove upmove downdrag and drop case


ready



function S(obj) {
    const cache = new WeakMap(); // Map of old - new references

    function copy(object) {
        if (typeof object !== 'object' ||
            object === null ||
            object instanceof HTMLElement
        )
            return object; // primitive value or HTMLElement

        if (object instanceof Date) 
            return new Date().setTime(object.getTime());

        if (object instanceof RegExp) 
            return new RegExp(object.source, object.flags);

        if (cache.has(object)) 
            return cache.get(object);

        const result = object instanceof Array ? [] : {};

        cache.set(object, result); // store reference to object before the recursive starts

        if (object instanceof Array) {
            for(const o of object) {
                 result.push(copy(o));
            }
            return result;
        }

        const keys = Object.keys(object); 

        for (const key of keys)
            result[key] = copy(object[key]);

        return result;
    }

    return copy(obj);
}

S(obj);
delete caserun single casemove upmove downdrag and drop case


ready



function T(obj){
    var clonedObjectsArray = [];
    var originalObjectsArray = []; //used to remove the unique ids when finished
    var next_objid = 0;

    function objectId(obj) {
        if (obj == null) return null;
        if (obj.__obj_id == undefined){
            obj.__obj_id = next_objid++;
            originalObjectsArray[obj.__obj_id] = obj;
        }
        return obj.__obj_id;
    }

    function cloneRecursive(obj) {
        if (null == obj || typeof obj == "string" || typeof obj == "number" || typeof obj == "boolean") return obj;

        // Handle Date
        if (obj instanceof Date) {
            var copy = new Date();
            copy.setTime(obj.getTime());
            return copy;
        }

        // Handle Array
        if (obj instanceof Array) {
            var copy = [];
            for (var i = 0; i < obj.length; ++i) {
                copy[i] = cloneRecursive(obj[i]);
            }
            return copy;
        }

        // Handle Object
        if (obj instanceof Object) {
            if (clonedObjectsArray[objectId(obj)] != undefined)
                return clonedObjectsArray[objectId(obj)];

            var copy;
            if (obj instanceof Function)//Handle Function
                copy = function(){return obj.apply(this, arguments);};
            else
                copy = {};

            clonedObjectsArray[objectId(obj)] = copy;

            for (var attr in obj)
                if (attr != "__obj_id" && obj.hasOwnProperty(attr))
                    copy[attr] = cloneRecursive(obj[attr]);                 

            return copy;
        }       


        throw new Error("Unable to copy obj! Its type isn't supported.");
    }
    var cloneObj = cloneRecursive(obj);



    //remove the unique ids
    for (var i = 0; i < originalObjectsArray.length; i++)
    {
        delete originalObjectsArray[i].__obj_id;
    };

    return cloneObj;
}

T(obj);
delete caserun single casemove updrag and drop case


ready



// I minify this solution because max test size is 2048 char
function U(e){const t=new WeakMap;return r(e);function r(e){if(e!==Object(e))return e;if(e instanceof Node)return e.cloneNode(!0);let t;switch(e.constructor){case Array:case Object:t=n(e);break;case Date:t=new Date(+e);break;case Function:const o=String(e);t=new Function("return "+(/^(?!function |[^{]+?=>)[^(]+?\(/.test(o)?"function ":"")+o)(),r=t,c=e,Object.defineProperties(r,Object.getOwnPropertyDescriptors(c));break;case RegExp:t=new RegExp(e);break;default:switch(Object.prototype.toString.call(e.constructor)){case"[object Function]":case"[object Undefined]":t=n(e);break;default:t=e}}var r,c;return t}function n(e){if(t.has(e))return t.get(e);const n=Array.isArray(e)?[]:Object.create(Object.getPrototypeOf(e));return t.set(e,n),Reflect.ownKeys(e).forEach(t=>(function(e,t,r={},n={}){const{configurable:c,writable:o}=Object.getOwnPropertyDescriptor(e,t)||{configurable:!0,writable:!0},a=c&&(void 0===o||o);if(!a||arguments.length<=2)return a;const i=Object.getOwnPropertyDescriptor(n,t)||{configurable:!0,writable:!0}||{};["get","set","value","writable","enumerable","configurable"].forEach(e=>void 0===r[e]&&(r[e]=i[e]));const{get:u,set:b,value:s,writable:l,enumerable:f,configurable:g}=r;return Object.defineProperty(e,t,{enumerable:f,configurable:g,...u||b?{get:u,set:b}:{value:s,writable:l}})})(n,t,{value:r(e[t])},e)),n}}

U(obj);

Test Case - click to add another test case
Teardown JS - click to add teardown JavaScript
Output (DOM) - click to monitor output (DOM) while test is running
RUN