fix: 修改循环引用问题

This commit is contained in:
LouisFonda 2024-04-19 16:58:13 +08:00
parent 81c2e04dfa
commit fbf31624c3

View File

@ -3,25 +3,45 @@
* @param {Object | Array} obj - 一个引用类型 Object 或者 Array * @param {Object | Array} obj - 一个引用类型 Object 或者 Array
* @returns {Object | Array} - 返回新的值 * @returns {Object | Array} - 返回新的值
*/ */
function copy(obj){ function copy(obj) {
// 判断这个值是否是引用值,如果不是的话就返回 // 使用map作为缓存缓存把对象作为key克隆后的新内容作为值
if (typeof obj !== 'object' || obj === null) return obj var oCatch = new Map()
// 判断数组是否是数组,如果是数组就采用数组的方式便利,否则使用对象的方式便利 return deepClone(obj)
var newObj = null function deepClone(obj) {
if(Array.isArray(obj)) { // 判断这个值是否是引用值,如果不是的话就返回
newObj = [] if (typeof obj !== "object" || obj === null) return obj;
var n = obj.length // 传入的值是一个引用类型,直接在缓存中查找,找到直接返回
for (var i = 0;i<n;i++) { if(oCatch.has(obj)) return oCatch.get(obj)
newObj[i] = copy(obj[i]) // 判断数组是否是数组,如果是数组就采用数组的方式便利,否则使用对象的方式便利
var newObj = null;
if (Array.isArray(obj)) {
newObj = [];
// 将新的引用类型存入缓存
oCatch.set(obj, newObj)
var n = obj.length;
for (var i = 0; i < n; i++) {
newObj[i] = deepClone(obj[i]);
}
} else {
newObj = {};
// 将新的引用类型存入缓存
oCatch.set(obj, newObj)
var keys = Object.keys(obj);
var n = keys.length;
for (var i = 0; i < n; i++) {
newObj[keys[i]] = deepClone(obj[keys[i]]);
}
} }
}else{
newObj = {}
var keys = Object.keys(obj);
var n = keys.length
for (var i = 0;i<n;i++) {
newObj[keys[i]] = copy(obj[keys[i]])
}
}
return newObj return newObj;
};
} }
var a = { name: "小红" }; // {name: '小红', b: {a: a, nema: '小王'}}
var b = { a: a, name: "小王" };
a.b = b;
var c = copy(a)
console.log(c.name);
console.log(c.b.a);
console.log(c.b.name);