You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
38 lines
1.3 KiB
38 lines
1.3 KiB
4 months ago
|
var toString = Object.prototype.toString;
|
||
|
/**
|
||
|
* Deeply clones a value to create a new instance.
|
||
|
*/
|
||
|
export function cloneDeep(value) {
|
||
|
return cloneDeepHelper(value);
|
||
|
}
|
||
|
function cloneDeepHelper(val, seen) {
|
||
|
switch (toString.call(val)) {
|
||
|
case "[object Array]": {
|
||
|
seen = seen || new Map();
|
||
|
if (seen.has(val))
|
||
|
return seen.get(val);
|
||
|
var copy_1 = val.slice(0);
|
||
|
seen.set(val, copy_1);
|
||
|
copy_1.forEach(function (child, i) {
|
||
|
copy_1[i] = cloneDeepHelper(child, seen);
|
||
|
});
|
||
|
return copy_1;
|
||
|
}
|
||
|
case "[object Object]": {
|
||
|
seen = seen || new Map();
|
||
|
if (seen.has(val))
|
||
|
return seen.get(val);
|
||
|
// High fidelity polyfills of Object.create and Object.getPrototypeOf are
|
||
|
// possible in all JS environments, so we will assume they exist/work.
|
||
|
var copy_2 = Object.create(Object.getPrototypeOf(val));
|
||
|
seen.set(val, copy_2);
|
||
|
Object.keys(val).forEach(function (key) {
|
||
|
copy_2[key] = cloneDeepHelper(val[key], seen);
|
||
|
});
|
||
|
return copy_2;
|
||
|
}
|
||
|
default:
|
||
|
return val;
|
||
|
}
|
||
|
}
|
||
|
//# sourceMappingURL=cloneDeep.js.map
|