function deepClone(data) {
let cache = [];
function _deepClone(data) {
if(typeof data !== 'object') return data;
// 缓存查询,解决循环引用问题
function get(value) {
return cache.find(map => map.key === value);
}
// 添加缓存记录
function set(value) {
let val = Array.isArray(value) ? Array.from(value) : Object.assign({}, value);
cache.push({
key: value,
val: val
});
return val;
}
let ret = Array.isArray(data) ? [] : {};
for(let key in data) {
let tmp = get(data[key]);
if(tmp) {
ret[key] = tmp.val;
} else {
if(typeof data[key] === 'object') {
tmp = set(data[key])
ret[key] = _deepClone(tmp);
} else {
ret[key] = data[key];
}
}
}
return ret;
}
let cloneData = _deepClone(data);
cache = null;
return cloneData;
}
核心思想就是通过手动构建key-map的数据结构来记录对象的引用,建立引用缓存,具体实现如上。