Depth-First Traversal
function clone(src){
var dest = src;
if(!src) {
return dest;
} else {
if(typeof src === 'object') {
if(Array.isArray(src)) {
dest = []
src.forEach(function(item, i) {
dest[i] = clone(item);
})
}else {
dest = {}
for(var p in src){
if(src.hasOwnProperty(p)) {
dest[p] = clone(src[p])
}
}
}
}
}
return dest;
}
Breadth-First Traversal
function inQue(item, dest, prop, queue) {
if(item && typeof item === 'object') {
if(Array.isArray(item)) {
dest[prop] = [];
}else{
dest[prop] = {};
}
queue.push({from: item, to: dest[prop]})
}else {
dest[prop] = item;
}
}
function clone(t) {
let queue = [{
from: t,
to: t
}];
let dest = t;
while(queue.length) {
let q = queue.shift();
let src = q.from;
let dest = q.to;
if(src && typeof src === 'object') {
if(Array.isArray(src)) {
dest = [];
src.forEach(function(item, idx) {
inQue(item, dest, idx, queue)
})
}else {
dest = {};
for(let p in src) {
let item = src[p];
if(src hasOwnProperty(p)) {
inQue(item, dest, p, queue)
}
}
}
} else {
dest = src;
}
}
return dest;
}