JS deepClone fn
A function to make a deep clone of an object instead of creating references/pointers to original object's depts.
by JakobJingleheimer
HTML
<div id="orig"></div>
<div id="clone"></div>
CSS
body {
color: #333;
font: 14px/24px Georgia, serif;
letter-spacing: 0.1em;
padding: 1em 0.5em;
}
div {
border-bottom: 1px dotted #ccc;
margin-bottom: 1em;
padding-bottom: 1em;
}
div:last-of-type {
border-bottom:none;
margin-bottom:0;
padding-bottom:0;
}
JavaScript
function deepCopy(obj)
{
this.cloneArr = function (arr)
{
var newArr = [];
for ( var i = arr.length-1; i >= 0; i-- )
{ newArr[i] = this.evalObj( arr[i] ); }
return newArr;
};
this.cloneObj = function(obj)
{
var newObj = {};
for ( var prop in obj )
{ newObj[prop] = this.evalObj( obj[prop] ); }
return newObj;
};
this.evalObj = function(obj)
{
switch ( typeof obj )
{
case 'object':
if ( Array.isArray( obj ) )
{ return this.cloneArr( obj ); }
if ( obj instanceof Date === false )
{ return this.cloneObj( obj ); }
// pass thru dates, strings, numbers, booleans, and functions
default:
return obj; // primitive
}
};
return this.evalObj(obj);
}
var foo = {
"bar": [ { "owth": 1 } ],
"baz": { "first": 2 },
"qux": "a",
"date": new Date
};
console.log('foo: ', foo);
document.getElementById("orig").innerHTML = JSON.stringify(foo);
var FOO = deepCopy( foo );
console.log('FOO: ', FOO);
document.getElementById("clone").innerHTML = JSON.stringify(FOO);