Javascript Typescript:迭代两个类之间的每个成员,并标记角度上的差异
如何比较两个类模型并找出相应的差异? 下面是两个成员完全相同的模型,我们需要进行比较 Typescript中是否有执行此操作的算法?*应使用类成员和布尔值不同的标志创建新的结果类 正在寻找一种简单的Typescript算法。它需要接受任何课程 注意:类中的某些成员包含类本身 目前 类别:Javascript Typescript:迭代两个类之间的每个成员,并标记角度上的差异,javascript,angular,typescript,angular7,Javascript,Angular,Typescript,Angular7,如何比较两个类模型并找出相应的差异? 下面是两个成员完全相同的模型,我们需要进行比较 Typescript中是否有执行此操作的算法?*应使用类成员和布尔值不同的标志创建新的结果类 正在寻找一种简单的Typescript算法。它需要接受任何课程 注意:类中的某些成员包含类本身 目前 类别: export class PropertyLocation { streetName: string; streetType: string; postdirectional?:
export class PropertyLocation {
streetName: string;
streetType: string;
postdirectional?: string;
unitNumber?: string;
unitType?: string;
city: string;
state?: string;
postalCode: number;
postalCodeExtension?: string;
effectiveStartDate: Date;
addressChangeReason?: AddressChangeReasonDto
addressSource?: SourceOfAddressDto;
}
结果类数组示例:
export class PropertyLocation {
streetName: string;
streetType: string;
postdirectional?: string;
unitNumber?: string;
unitType?: string;
city: string;
state?: string;
postalCode: number;
postalCodeExtension?: string;
effectiveStartDate: Date;
addressChangeReason?: AddressChangeReasonDto
addressSource?: SourceOfAddressDto;
}
如果有更好的存储方法,请随意修改
export class DifferenceClass {
ClassMember: string;
DifferentFlag: boolean
}
寻找代码解决方案,避免使用第三方库,因为公司不喜欢为什么不在运行比较的类中构建一个方法/函数呢。您可以通过单独比较每个属性(键入所有内容)或循环类中的每个键并将其与传入对象中的每个键进行比较来实现这一点
类差异类{
构造函数(类成员,differenceFlag){
this.ClassMember=ClassMember;
this.DifferenceFlag=DifferenceFlag;
}
}
班主任{
构造函数(名字,姓氏){
this.firstName=firstName;
this.lastName=lastName;
}
IsName(个人){
if(person instanceof person){
常数差=[];
用于(const-key-in-person){
如果(此[键]!==个人[键]){
差异推送(新的差异类(key,true));
}
}
回报差异;
}否则{
抛出新错误('对象不是Person类');
}
}
}
常量p1=新人(“约翰”、“多伊”);
const p2=新人(“简”、“多伊”);
console.log('应该为空',p1.isname(p1));
log('Should have diff results',p1.isname(p2));
console.log('应该是异常',p1.isSame(1))代码>为什么不在运行比较的类中构建一个方法/函数呢。您可以通过单独比较每个属性(键入所有内容)或循环类中的每个键并将其与传入对象中的每个键进行比较来实现这一点
类差异类{
构造函数(类成员,differenceFlag){
this.ClassMember=ClassMember;
this.DifferenceFlag=DifferenceFlag;
}
}
班主任{
构造函数(名字,姓氏){
this.firstName=firstName;
this.lastName=lastName;
}
IsName(个人){
if(person instanceof person){
常数差=[];
用于(const-key-in-person){
如果(此[键]!==个人[键]){
差异推送(新的差异类(key,true));
}
}
回报差异;
}否则{
抛出新错误('对象不是Person类');
}
}
}
常量p1=新人(“约翰”、“多伊”);
const p2=新人(“简”、“多伊”);
console.log('应该为空',p1.isname(p1));
log('Should have diff results',p1.isname(p2));
console.log('应该是异常',p1.isSame(1))代码>我有一个比较两个对象并进行深度比较的函数
export const compare = (obj1: any, obj2: any): boolean =>
Array.isArray(obj1)
? Array.isArray(obj2) && obj1.length === obj2.length && obj1.every((item, index) => compare(item, obj2[index]))
: obj1 instanceof Date
? obj2 instanceof Date && obj1.getDate() === obj2.getDate()
: obj1 && typeof obj1 === 'object'
? obj2 && typeof obj2 === 'object' &&
Object.getOwnPropertyNames(obj1).length === Object.getOwnPropertyNames(obj2).length &&
Object.getOwnPropertyNames(obj1).every(prop => compare(obj1[prop], obj2[prop]))
: obj1 === obj2;
你可以用这个
const diff = (obj1, obj2) => Object.keys(obj1).map(key => ({ ClassMember: key, DifferentFlag: !compare(obj1[key], obj2[key]) }));
我有一个函数可以比较两个对象并进行深度比较
export const compare = (obj1: any, obj2: any): boolean =>
Array.isArray(obj1)
? Array.isArray(obj2) && obj1.length === obj2.length && obj1.every((item, index) => compare(item, obj2[index]))
: obj1 instanceof Date
? obj2 instanceof Date && obj1.getDate() === obj2.getDate()
: obj1 && typeof obj1 === 'object'
? obj2 && typeof obj2 === 'object' &&
Object.getOwnPropertyNames(obj1).length === Object.getOwnPropertyNames(obj2).length &&
Object.getOwnPropertyNames(obj1).every(prop => compare(obj1[prop], obj2[prop]))
: obj1 === obj2;
你可以用这个
const diff = (obj1, obj2) => Object.keys(obj1).map(key => ({ ClassMember: key, DifferentFlag: !compare(obj1[key], obj2[key]) }));
您可以使用以下库:
从'deep diff'导入{diff};
常数差异=差异(位置1,位置2);
它创建了一个很好的差异对象,其中包含指向不同属性的路径。您可以使用库:
从'deep diff'导入{diff};
常数差异=差异(位置1,位置2);
它创建了一个很好的差异对象,其中包含指向不同属性的路径。另一种方法是使用管道将类添加到模板中
import { Pipe, PipeTransform } from '@angular/core';
const resolveProperty = (obj: any, property: string): any =>
property ? property.split('.').reduce((result, prop) => (result ? result[prop] : undefined), obj) : undefined;
@Pipe({
name: 'different'
})
export class DifferentPipe implements PipeTransform {
transform(obj: any, obj2: any, property: string): boolean {
return resolveProperty(obj, property) !== resolveProperty(obj2, property);
}
}
在视图中,如果对象已更改,则可以添加一个类
<div [ngClass]="{ 'changed': original | changed : new : property }">
另一种方法是使用管道将类添加到模板中
import { Pipe, PipeTransform } from '@angular/core';
const resolveProperty = (obj: any, property: string): any =>
property ? property.split('.').reduce((result, prop) => (result ? result[prop] : undefined), obj) : undefined;
@Pipe({
name: 'different'
})
export class DifferentPipe implements PipeTransform {
transform(obj: any, obj2: any, property: string): boolean {
return resolveProperty(obj, property) !== resolveProperty(obj2, property);
}
}
在视图中,如果对象已更改,则可以添加一个类
<div [ngClass]="{ 'changed': original | changed : new : property }">
您是否可以提供一些示例以供测试?不是现成的解决方案,但此库可能对您有用:您是否可以提供一些示例以供测试?不是现成的解决方案,但此库可能对您有用:复杂属性如何?它还需要标记每个已更改的成员,不仅仅是比较整个对象,还可以在问题的底部看到不同的类示例对象。在这种情况下,我建议您尽可能多地进行比较(手动进行每个单独的比较)。例如,如果其中一个属性是一个复杂类,您可以在该目标类中创建一个类似的方法。那么复杂属性呢?它还需要标记每个已更改的成员,而不仅仅是比较整个对象,请在问题底部查看不同的类示例对象。在这种情况下,我建议您进行长距离标记(手动执行每个单独的比较)。例如,如果其中一个属性是复杂类,则可以在该目标类中创建类似的方法。谢谢,它还需要标记每个已更改的成员,而不仅仅是比较整个对象,请参见问题底部的不同类示例对象谢谢,它需要标记每个已更改的成员,而不仅仅是比较谁le对象,查看问题底部的不同类示例对象Cool,刚刚尝试过,你有详细的答案吗,它需要标记每个已更改的成员,而不仅仅是比较整个对象,查看问题底部的不同类示例对象Cool,刚刚尝试过,你有详细的答案吗,它需要标记每个已更改的成员还挂起,不只是比较整个对象,在问题底部看到不同的类示例对象酷,它还需要标记每个已更改的成员,不只是比较整个对象,在问题底部看到不同的类示例对象,问题标题试图标记每个成员你将ngClass语句放在每个需要海莉