Skip to content

Instantly share code, notes, and snippets.

@mutongwu
Last active July 15, 2019 02:37
Show Gist options
  • Save mutongwu/a49e125e650f357cc4a9ec2968b73802 to your computer and use it in GitHub Desktop.
Save mutongwu/a49e125e650f357cc4a9ec2968b73802 to your computer and use it in GitHub Desktop.
deep clone object

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;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment