web-utils-curd
Version:
前端工具包
80 lines (79 loc) • 2.45 kB
text/typescript
/**
* 封装操作对象的方法
*/
class ObjectTool {
mergeObject(...args: any) {
// 声明一个空对象
const result: any = {};
// 遍历所有的参数对象
args.forEach((obj:any) => {
// 获取当前对象所有的属性
Object.keys(obj).forEach((key) => {
// 检测 result 是否存在 key 属性
if (result.hasOwnProperty(key)) {
result[key] = [].concat(result[key], obj[key]);
} else {
// 如果没有 则直接写入
result[key] = obj[key];
}
});
});
return result;
}
/**
* 浅拷贝
* @param target 目标对象
* @returns 拷贝过后的对象
*/
clone(target: any) {
// 类型判断
if (typeof target === "object" && target !== null) {
// 判断数据是否为数组
if (Array.isArray(target)) {
return [...target];
} else {
return { ...target };
}
} else {
return target;
}
};
/**
* 深拷贝,解决了循环引用问题
* @param target 目标对象
* @param map map
* @returns 返回拷贝后的对象
*/
deepClone(target: any, map = new Map()) {
// 检测数据类型
if (typeof target === "object" && target !== null) {
// 克隆数据之前,进行判断,数据是否之前克隆过
let cache = map.get(target);
if (cache) {
return cache;
}
// 创建一个容器
let isArray = Array.isArray(target);
const result: any = isArray ? [] : {};
// 将新的结果存入到容器中
map.set(target, result);
// 遍历元素
// 如果目标数据为数组使用 forEach
if (isArray) {
// forEach 遍历
target.forEach((item: any, index: number) => {
result[index] = this.deepClone(item, map);
});
} else {
// 如果是对象
Object.keys(target).forEach((key) => {
result[key] = this.deepClone(target[key], map);
});
}
return result;
} else {
return target;
}
}
}
export default new ObjectTool();