|
|
|
@ -255,23 +255,47 @@ export function omit(object, keysToOmit) {
|
|
|
|
|
/**
|
|
|
|
|
* 深拷贝
|
|
|
|
|
*/
|
|
|
|
|
export function cloneDeep(value) {
|
|
|
|
|
// return structuredClone(value);
|
|
|
|
|
if (typeof value !== "object" || value === null) {
|
|
|
|
|
return value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const result = Array.isArray(value) ? [] : {};
|
|
|
|
|
|
|
|
|
|
for (const key in value) {
|
|
|
|
|
if (Object.prototype.hasOwnProperty.call(value, key)) {
|
|
|
|
|
result[key] = cloneDeep(value[key]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
export function cloneDeep(value, visited = new WeakMap()) {
|
|
|
|
|
// 处理循环引用
|
|
|
|
|
if (visited.has(value)) {
|
|
|
|
|
return visited.get(value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 特殊对象和基本类型处理
|
|
|
|
|
if (value instanceof Date) {
|
|
|
|
|
return new Date(value);
|
|
|
|
|
}
|
|
|
|
|
if (value instanceof RegExp) {
|
|
|
|
|
return new RegExp(value.source, value.flags);
|
|
|
|
|
}
|
|
|
|
|
if (value === null || typeof value !== 'object') {
|
|
|
|
|
return value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 创建一个新的WeakMap项以避免内存泄漏
|
|
|
|
|
let result;
|
|
|
|
|
if (Array.isArray(value)) {
|
|
|
|
|
result = [];
|
|
|
|
|
visited.set(value, result);
|
|
|
|
|
} else {
|
|
|
|
|
result = {};
|
|
|
|
|
visited.set(value, result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (const key of Object.getOwnPropertySymbols(value)) {
|
|
|
|
|
// 处理Symbol属性
|
|
|
|
|
result[key] = cloneDeep(value[key], visited);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (const key in value) {
|
|
|
|
|
if (Object.prototype.hasOwnProperty.call(value, key)) {
|
|
|
|
|
// 处理普通属性
|
|
|
|
|
result[key] = cloneDeep(value[key], visited);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 向零四舍五入, 固定精度设置
|
|
|
|
|
*/
|
|
|
|
|