在 Lodash 中比较两个对象
Lodash 有一个 isEqual()
的函数 检查两个值是否 深度相等 。 这个函数不同于 ===
operator ,它只检查两个对象是否是完全相同的引用:
const obj1 = {
name: 'Will Riker',
rank: 'Commander',
age: 29
};
const obj2 = {
name: 'Will Riker',
rank: 'Commander',
age: 29
};
obj1 === obj1; // true
// `===` only checks if two objects are the same reference, not if the
// the two objects have the exact same keys and values.
obj1 === obj2; // false
// Lodash's `isEqual()` checks if the two objects have the same keys
// and values:
_.isEqual(obj1, obj2); // true
比较原始值时, isEqual()
函数使用 SameValueZero 语义 ,这意味着 NaN
被认为等于自身,并且 +0
被认为等于 -0
。
_.isEqual({ x: NaN }, { x: NaN }); // true
_.isEqual({ x: +0 }, { x: -0 }); // true
内置类
此外, isEqual()
足够聪明来 比较数组 ,日期, Number
实例和其他内置类:
const obj1 = {
date: new Date('2020/06/01'),
num: new Number(1)
};
const obj2 = {
date: new Date('2020/06/01'),
num: 1
};
_.isEqual(obj1, obj2); // true
这使得 isEqual()
非常适合检查两个 POJO 是否具有相同的数据。
类
isEqual()
如果两个对象是不同类的实例,则函数将它们视为不同的对象。 例如,即使下面示例中的两个对象具有相同的键和值,但它们是不同的,因为 obj2
是的实例 Character
类和 obj1
不是。
const obj1 = { name: 'Will Riker', rank: 'Commander' };
class Character {}
const obj2 = new Character();
Object.assign(obj2, { name: 'Will Riker', rank: 'Commander' });
_.isEqual(obj1, obj2); // false
根据您的用例,这可能是一个问题。 但是,一般来说,您应该只使用 isEqual()
用于比较 POJO 和复杂类。 特别是,如果你想比较 Mongoose 文档 ,你应该将文档转换为 POJO 使用 toObject()
第一的:
const Character = mongoose.model('Character', Schema({
_id: false,
name: String,
age: Number
}));
const doc = new Character({ name: 'Will Riker', age: 29 });
// false, because `doc` is a document, not a POJO
_.isEqual(doc, { name: 'Will Riker', age: 29 });
// true
_.isEqual(doc.toObject(), { name: 'Will Riker', age: 29 });
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: Vuex Getters 介绍和使用
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论