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 }[];
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 isEqual(): boolean {
return this._isEqual;
}
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;
}
async upDataTranslate(): Promise<TranslateItem[] | []> {
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 [];
}
}