SOURCE

console 命令行工具 X clear

                    
>
console
import { isEqual } from "lodash";


// 定义枚举类型
export enum TranslateType {
    SpaceName = 'SpaceName',
    SpaceDescription = 'SpaceDescription',
    DirectoryName = 'DirectoryName'
}

export interface KeyWorkAndType {
    keyName: string;
    type: TranslateType
}

export interface TranslateItem {
    keyworks: string;
    name: string;
    spaceId?: string;
    type: TranslateType;
}

interface ObjType {
    [key: string]: any
}


function generateRandomString(length: number): string {
    const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join('');
}

const modifyTranslationData = (data: TranslateItem[]): Promise<TranslateItem[]> => {
    return new Promise((resolve, reject) => {
        try {
            const processedData = data.map((item) => ({
              ...item,
                keyworks: item.keyworks || generateRandomString(8)
            }));
            resolve(processedData);
        } catch (error) {
            reject(error);
        }
    });
}

export class ObjectMerger {
    // 接收的两个对象参数
    private oldData: ObjType;
    private newData: ObjType;
    // 用于指定需要比较的键的数组
    private compareKeys: string[];
    // 用于翻译比较的键的数组
    private translateDiffKeys: string[];
    // 包含键名和对应类型的数组
    private keyWorkAndType: { keyName: string; type: TranslateType }[];
    // 空间ID,类型为字符串
    private spaceId: string;
    // 新增私有属性,用于缓存比较结果
    private _isEqual: boolean = true;

    // 构造函数,用于接收并初始化六个参数
    constructor(oldData: ObjType, newData: ObjType, compareKeys: string[], translateDiffKeys: string[], keyWorkAndType: { keyName: string; type: TranslateType }[], spaceId: string) {
        this.oldData = oldData;
        this.newData = newData;
        this.compareKeys = compareKeys;
        this.translateDiffKeys = translateDiffKeys;
        this.keyWorkAndType = keyWorkAndType;
        this.spaceId = spaceId;
        // 初始化时计算比较结果并缓存
        this._isEqual = this.areObjectsEqual();
    }

    // 方法:重新设置第一个对象的值
    setOldData(data: ObjType) {
        this.oldData = data;
        // 设置完后更新比较结果缓存
        this._isEqual = this.areObjectsEqual();
    }

    // 方法:重新设置第二个对象的值
    setNewData(data: ObjType) {
        this.newData = data;
        // 设置完后更新比较结果缓存
        this._isEqual = this.areObjectsEqual();
    }

    // 新增只读属性,通过get访问器实现,外部只能读取不能修改,用于实时获取比较结果是否变化
    get isEqual(): boolean {
        return this._isEqual;
    }

    // 方法:比较两个对象指定键对应的值是否相等,根据类中保存的compareKeys、translateDiffKeys数组以及keyWorkAndType进行相关逻辑处理,同时结合spaceId(此处可按需扩展),全部相等返回true,否则返回false
    areObjectsEqual(): boolean {
        for (const key of this.compareKeys) {
            if (!Object.prototype.hasOwnProperty.call(this.oldData, key) ||!Object.prototype.hasOwnProperty.call(this.newData, key)) {
                return false;
            }
            if (!isEqual(this.oldData[key], this.newData[key])) {
                return false;
            }
        }

        return true;
    }

    // 新增方法:processWithDetails,整合之前提供的逻辑
    async upDataTranslate(): Promise<TranslateItem[] | []> {
        // 校验translateDiffKeys和keyWorkAndType长度是否相等
        if (this.translateDiffKeys.length!== this.keyWorkAndType.length) {
            throw new Error('The number of elements in keys array and details array must be equal');
        }

        console.log('this.oldData', this.oldData)
        console.log('this.newData', this.newData)

        const oldObj:ObjType = {}
        const newObj:ObjType = {}
        this.translateDiffKeys.forEach((item)=> {
            oldObj[item] = this.oldData[item]
            newObj[item] = this.newData[item]
        })

        this.keyWorkAndType.forEach((item)=> {
            oldObj[item.keyName] = this.oldData[item.keyName]
            newObj[item.keyName] = this.newData[item.keyName]
        })

        console.log('oldObj', oldObj)
        console.log('newObj', newObj)
        
        for (const key of this.translateDiffKeys) {
            if (!(key in oldObj && key in newObj)) {
                throw new Error(`Key ${key} is not a valid key in the provided objects`);
            }
        }

        const translateData: TranslateItem[] = [];
        // 比较两个对象对应键的属性值,收集需要变更的数据
        for (const [index, objKeys] of this.translateDiffKeys.entries()) {
            if (!isEqual(oldObj[objKeys], newObj[objKeys])) {
                translateData.push({
                    keyworks: this.keyWorkAndType[index].keyName,
                    name: newObj[objKeys],
                    spaceId: this.spaceId,
                    type: this.keyWorkAndType[index].type
                });
            }
        }
        console.log('需要变更的数据', translateData);
        if (translateData.length) {
            return await modifyTranslationData(translateData);
        }
        return [];
    }
}