/*
 * @Author: dgflash
 * @Date: 2022-07-26 15:29:57
 * @LastEditors: dgflash
 * @LastEditTime: 2022-09-02 12:07:54
 */

/** 对象工具 */
export class ObjectUtil {
    /**
     * 判断指定的值是否为对象
     * @param value 值
     */
    static isObject(value: any): boolean {
        return Object.prototype.toString.call(value) === '[object Object]';
    }

    /**
     * 深拷贝
     * @param target 目标
     */
    static deepCopy(target: any): any {
        if (target == null || typeof target !== 'object') {
            return target;
        }

        let result: any = null;

        if (target instanceof Date) {
            result = new Date();
            result.setTime(target.getTime());
            return result;
        }

        if (target instanceof Array) {
            result = [];
            for (let i = 0, length = target.length; i < length; i++) {
                result[i] = this.deepCopy(target[i]);
            }
            return result;
        }

        if (target instanceof Object) {
            result = {};
            for (const key in target) {
                if (target.hasOwnProperty(key)) {
                    result[key] = this.deepCopy(target[key]);
                }
            }
            return result;
        }

        console.warn(`不支持的类型：${result}`);
    }

    /**
     * 拷贝对象
     * @param target 目标
     */
    static copy(target: object): object {
        return JSON.parse(JSON.stringify(target));
    }

    /**
     * @function 检测是否为非法对象，比如"",null, undefined, NaN, [], {}
     * @param {any} obj 任意基础数据对象，如：number、string、array、object等
     * @returns boolean 非法为trre, 否则为false
     */
    static isIllegalObject(obj: any): boolean {
        // 检查是否为空或未定义
        if (obj == null || obj == undefined) return true;
        // 检查是否是特殊值
        if (obj === Infinity || obj === -Infinity) return true;
        // 检测是否包含空格的字符串
        if (typeof obj === "string" && obj.trim() === "") return true;
        // 检查是否是无效的数字
        if (Number.isNaN(obj)) return true;
        // 检查是否是空数组
        if (Array.isArray(obj) && obj.length <= 0) return true;
        // 检查是否是空对象
        if (typeof (obj) == "object" && Object.keys(obj).length <= 0) return true;
        return false;
    }
}
