Skip to content

Instantly share code, notes, and snippets.

@kwoktung
Created March 1, 2020 12:14
Show Gist options
  • Save kwoktung/fac286287df3eb9a9b3c0f1d66051d80 to your computer and use it in GitHub Desktop.
Save kwoktung/fac286287df3eb9a9b3c0f1d66051d80 to your computer and use it in GitHub Desktop.
deep Copy Loop
function deepCopyLoop(obj){
let type = Object.prototype.toString.call(obj)
let ret
let SrcQuene = [];
let DestQuene = [];
let m = new WeakMap();
switch (type) {
case '[object Null]':
case '[object Undefined]':
case '[object Number]':
case '[object String]':
case '[object Function]':
case '[object Symbol]':
ret = obj;
break;
case '[object Date]':
ret = new Date(obj)
break
case '[object RegExp]':
ret = new RegExp(obj);
break
case '[object Array]':
ret = [];
SrcQuene.push(obj);
DestQuene.push(ret);
m.set(obj, ret)
break
case '[object Object]':
ret = {}
SrcQuene.push(obj);
DestQuene.push(ret);
m.set(obj, ret)
break
default:
ret = obj
}
while (SrcQuene.length > 0 && DestQuene.length > 0) {
src = SrcQuene.shift();
dest = DestQuene.shift();
for (let key in src) {
if (src.hasOwnProperty(key)){
let val = src[key]
if (m.has(val)) {
dest[key] = m.get(val);
break
}
let type = Object.prototype.toString.call(val)
switch (type) {
case "[object Array]":
SrcQuene.push(val);
dest[key] = []
DestQuene.push(dest[key]);
break;
case "[object Object]":
SrcQuene.push(val);
dest[key] = {};
DestQuene.push(dest[key]);
break;
case '[object Null]':
case '[object Undefined]':
case '[object Number]':
case '[object String]':
case '[object Function]':
case '[object Symbol]':
case '[object Symbol]':
dest[key] = val;
break;
case '[object Date]':
dest[key] = new Date(val)
break
case '[object RegExp]':
dest[key] = new RegExp(val)
break
default:
dest[key] = val
}
}
}
}
return ret
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment