如何使用Typescript比较两个对象?

4

我有一个叫做tax的类。

    export class tax {
        private _id: string;
        private _name: string;
        private _percentage: number;`

        constructor(id: string = "", taxName: string = "", percentage: number = 0) {
            this._id = id;
            this._name = taxName;
            this._percentage = percentage;
        }


        public get id(): string {
            return this._id;
        }

        public set id(v: string) {
            this._id = v;
        }
        public get name(): string {
            return this._name;
        }

        public set name(v: string) {
            this._name = v;
        }
        public get percentage(): number {
            return this._percentage;
        }

        public set percentage(v: number) {
            this._percentage = v;
        }

        toString(){
            return this.id;
        }
    }

当我创建这个类的两个不同对象时,
    a1: tax = new tax("id","name",4);
    a2: tax = new tax("id","name",4); 

    console.log(a1 === a2); //false
    console.log(a1 == a2); //false

当我比较a1和a2时,希望结果为true。 为了实现a1 === a2,我需要在我的类中进行哪些更改? 在税务类中我需要执行什么操作?或者我需要重写税务类中的哪个方法?


“它应该返回true”,而不是“它不应该返回true”。这只对于相同的对象和其引用才会返回true,而不是像你的情况一样对于两个不同的对象。因为你构造了两个新对象,它们并不相同,即使它们看起来可能很相似。 - dfsq
我的问题是:当我创建两个具有相同值的不同对象时,我需要在我的“tax”类中做出哪些更改,以便比较这两个对象会返回true。 - vishvas chauhan
你无法通过任何手段使得 === 对于两个不同的对象返回 true。但是,你可以聪明地将 Tax 类转换为某种单例变体,这样它就不会为相同的参数构造新对象,而是返回先前的对象。然后 a1 === a2 就会返回 true - dfsq
如果您愿意使用lodash,它提供了一种深度比较对象的方法。只需使用_.isEqual(a1, a2)进行比较即可。文档可以在此处找到:https://lodash.com/docs/4.17.5#isEqual - spencer
这里需要记住的是,您正在检查引用(内存位置)的相等性,但您想要进行值比较。 - Ken
他们关闭了这个帖子,指向一个具有超过4页阅读量的Javascript问题,但我刚想到了一个Typescript答案......甚至可以允许您忽略某些属性......在字段27和30的情况下......我想在新obj上实现这些功能,而不是已经存在的obj,但需要忽略某些属性。const nameof = <T>(name: Extract<keyof T, string>): string => name; for (const key in Obj1) { if(Obj2[key]!=undefined && (nameof(key) != 'field27' && nameof(key) != 'field30')) { if(Obj1[key] != Obj2[key]) { alreadyExists = false; break; } - AppDreamer
1个回答

3

您正在比较同一类的两个不同实例。即使在实例内部值相同,它们也是完全独立的实体。

例如,如果我们有一个People类,其中只有一个属性name。即使世界上有两个名叫John Smith的人,他们也是两个完全独立的人。

每个实例都有其自己的唯一标识符。

如果您想检查两个税是否具有完全相同的值,则可以逐个检查它们。

console.log(a1.getId() === a2.getId() && a1.getName() === a2.getName() && a1.getPercentage() === a2.getPercentage()) // true

关于比较对象的更多信息可以在这里找到。


我曾经使用过这个成功的库(避免手动比较):https://www.npmjs.com/package/deep-equal - milosmns

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接