打字稿如何比较两个对象? [复制]
Posted
技术标签:
【中文标题】打字稿如何比较两个对象? [复制]【英文标题】:how typescript comparing two objects? [duplicate] 【发布时间】:2017-09-23 20:29:53 【问题描述】:我有一门课叫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;
当我创建这个类的 2 个不同对象时
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 它应该给真。 我必须在课堂上做什么改变,这样它才能给出 a1 === a2 ? 我必须在税课上做什么?或者我必须在税类中覆盖哪种方法?
【问题讨论】:
“它应该给出真实的” 不是它不应该。它只适用于 same 对象,因此对象及其引用。不适用于您的情况下的两个不同对象。因为您构造了两个新对象,所以它们并不相同,即使它们看起来很相似。 我的问题是**当我创建两个具有相同值的不同对象时,我必须在tax
类中做哪些更改然后**我比较这两个对象它会给我真实的。
你不能做任何事情,所以===
给你true
两个不同的对象。但是,当 Tax 类不会为相同的参数构造新对象但返回前一个对象时,您可以聪明地做它并将其转换为某种 Singleton 变体。那么a1 === a2
将是true
。
如果你对使用 lodash 没问题,它提供了一种在对象之间进行深度比较的方法。只需与 _.isEqual(a1, a2) 进行比较。文档可以在这里找到:lodash.com/docs/4.17.5#isEqual
这里要记住的是,您正在检查引用(内存位置)的相等性,但您想要进行值比较。
【参考方案1】:
您正在比较同一类的两个不同实例。尽管实例中的值相同,但它们是两个完全独立的实体。
例如,如果我们有一个具有单个属性 name
的 People
类。即使世界上有两个人叫John Smith
,他们也是两个完全不同的人。
每个实例都有自己的唯一标识符。
如果要检查两种税的值是否完全相同,可以一一检查。
console.log(a1.getId() === a2.getId() && a1.getName() === a2.getName() && a1.getPercentage() === a2.getPercentage()) // true
有关比较对象的更多信息可以找到here
【讨论】:
我成功使用了这个(以避免编写手动比较):npmjs.com/package/deep-equal以上是关于打字稿如何比较两个对象? [复制]的主要内容,如果未能解决你的问题,请参考以下文章