TypeScript 中如何比较对象
要比较 TypeScript 中的对象:
-
使用
JSON.stringify()
比较键顺序相同的对象。 - 如果对象没有嵌套,请进行浅比较。
-
使用
lodash.isEqual
测试对象的深度相等性。
当两个对象中键的顺序相同时,可以使用 JSON.stringify
方法来比较对象。
type Person = {
name: string;
age: number;
};
const obj1: Person = {
name: 'Tom',
age: 30,
};
const obj2: Person = {
name: 'Tom',
age: 30,
};
if (JSON.stringify(obj1) === JSON.stringify(obj2)) {
console.log('✅ objects are equal');
} else {
console.log('⛔️ objects are NOT equal');
}
我们使用 JSON.stringify
方法将对象转换为字符串并比较结果。
请注意,仅当两个对象中键的顺序相同时才应使用此方法。 例如,以下比较返回 false。
// 👇️ false
console.log(
JSON.stringify({ age: 30, name: 'Tom' }) ===
JSON.stringify({ name: 'Tom', age: 30 })
);
如果我们的对象仅包含我们预先知道的几个键值对,请使用逻辑 AND &&
运算符并比较键值对。
type Person = {
name: string;
age: number;
country: string;
};
const obj1: Person = {
country: 'Chile',
name: 'Tom',
age: 30,
};
const obj2: Person = {
age: 30,
name: 'Tom',
country: 'Chile',
};
let areEqual = false;
if (
obj1.name === obj2.name &&
obj1.age === obj2.age &&
obj1.country === obj2.country
) {
areEqual = true;
}
console.log(areEqual); // 👉️ true
示例中的对象只有几个键值对,我们可以在 if
语句中手动比较它们而不会使事情变得过于复杂。
TypeScript 中对象的浅比较
如果你的对象没有嵌套属性,你可以做一个相对简单的浅比较。
type Person = {
name: string;
age: number;
};
const obj1: Person = {
name: 'Tom',
age: 30,
};
const obj2: Person = {
age: 30,
name: 'Tom',
};
// ✅ Shallow comparison
const shallowComparison =
Object.keys(obj1).length === Object.keys(obj2).length &&
(Object.keys(obj1) as (keyof typeof obj1)[]).every((key) => {
return (
Object.prototype.hasOwnProperty.call(obj2, key) && obj1[key] === obj2[key]
);
});
console.log(shallowComparison); // 👉️ true
我们在浅层比较中做的第一件事是使用 Object.keys
方法获取两个对象的键数组,并检查两个对象是否具有相同数量的键值对。
如果两个对象的键值对计数不相同,则对象不相等。
我们所做的第二个比较是 - 检查第一个对象中的每个键是否存在于第二个对象中。
在键入 Object.keys()
方法的结果时,我们必须使用类型断言,因为 TypeScript 将类型设置为 string[],并且我们需要数组的类型仅包含对象的键。
我们需要检查的最后一件事是两个对象中的相同键是否返回相同的值。
如果至少一次不满足条件,every
方法将返回 false。
否则,every
方法返回 true,我们可以断定浅相等检查通过。
TypeScript 中对象的深度比较
在 TypeScript 中对对象进行深度比较的最简单方法是安装和使用 lodash.iseQual
库。
在项目的根目录中打开终端并使用以下 2 个命令安装 lodash:
$ npm i lodash.isequal
$ npm i --save-dev @types/lodash.isequal
现在我们可以使用该库来测试对象的深度相等性。
import isEqual from 'lodash.isequal';
type Person = {
name: string;
age: number;
address: {
country: string;
city: string;
};
};
const obj1: Person = {
name: 'Tom',
age: 30,
address: {
country: 'Chile',
city: 'Santiago',
},
};
const obj2: Person = {
address: {
country: 'Chile',
city: 'Santiago',
},
age: 30,
name: 'Tom',
};
console.log(isEqual(obj1, obj2)); // 👉️ true
isEqual
方法在传入的值之间执行深度比较并返回一个布尔结果 - 如果它们相等,则返回 true,否则返回 false。
该方法支持比较对象、数组、Maps、Date对象、Sets等。
当我们必须对对象进行深度比较时,这是首选方法,因为实现解决此问题的功能相对复杂。
相关文章
在 AngularJs 中设置 Select From Typescript 的默认选项值
发布时间:2023/04/14 浏览次数:78 分类:Angular
-
本教程提供了在 AngularJs 中从 TypeScript 中设置 HTML 标记选择的默认选项的解释性解决方案。
在 Angular 中使用 TypeScript 的 getElementById 替换
发布时间:2023/04/14 浏览次数:153 分类:Angular
-
本教程指南提供了有关使用 TypeScript 在 Angular 中替换 document.getElementById 的简要说明。这也提供了在 Angular 中 getElementById 的最佳方法。
在 TypeScript 中使用 try..catch..finally 处理异常
发布时间:2023/03/19 浏览次数:181 分类:TypeScript
-
本文详细介绍了如何在 TypeScript 中使用 try..catch..finally 进行异常处理,并附有示例。
在 TypeScript 中使用 declare 关键字
发布时间:2023/03/19 浏览次数:97 分类:TypeScript
-
本教程指南通过特定的实现和编码示例深入了解了 TypeScript 中 declare 关键字的用途。
在 TypeScript 中 get 和 set
发布时间:2023/03/19 浏览次数:172 分类:TypeScript
-
本篇文章演示了类的 get 和 set 属性以及如何在 TypeScript 中实现它。
在 TypeScript 中格式化日期和时间
发布时间:2023/03/19 浏览次数:161 分类:TypeScript
-
本教程介绍内置对象 Date() 并讨论在 Typescript 中获取、设置和格式化日期和时间的各种方法。
在 TypeScript 中返回一个 Promise
发布时间:2023/03/19 浏览次数:182 分类:TypeScript
-
本教程讨论如何在 TypeScript 中返回正确的 Promise。这将提供 TypeScript 中 Returns Promise 的完整编码示例,并完整演示每个步骤。
在 TypeScript 中定义函数回调的类型
发布时间:2023/03/19 浏览次数:221 分类:TypeScript
-
本教程说明了在 TypeScript 中为函数回调定义类型的解决方案。为了程序员的方便和方便,实施了不同的编码实践指南。
在 TypeScript 中把 JSON 对象转换为一个类
发布时间:2023/03/19 浏览次数:110 分类:TypeScript
-
本教程演示了如何将 JSON 对象转换为 TypeScript 中的类。