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

    /**
     * 深拷贝
     * @param target 目标
     */
    static deepCopy(target: any) {
        if (!target || 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;
        }
    }

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

    static mapToObject(data: any) {
        let obj = {}

        if (data instanceof Map) {
            for (let [key, value] of data) {
                if (value instanceof Map) {
                    let temp = {}
                    for (let [k, v] of value) {
                        temp[k] = v;
                    }
                    obj[key] = temp;
                } else if (value instanceof Array) {
                    obj[key] = value;
                } else if (typeof value === "object") {
                    let newObj = this.mapToObject(value)
                    obj[key] = newObj
                } else {
                    obj[key] = value
                }
            }
        } else {
            for (let key in data) {
                if (data[key] instanceof Map) {
                    let temp = {}
                    for (let [k, v] of data[key]) {
                        temp[k] = v;
                    }
                    obj[key] = temp
                } else if (typeof data[key] === "number" || typeof data[key] === "string" || data[key] instanceof Array || typeof data[key] === "boolean") {
                    obj[key] = data[key];
                } else if (typeof data[key] === "object") {
                    obj = this.mapToObject(data[key])
                }
                else if (typeof data === "object") {
                    obj = data
                    break
                }
                else {
                    obj[key] = data[key]
                }
            }
        }



        return obj
    }

 
}