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