在 Lodash 中比较两个对象

发布于 2023-01-30 21:29:53 字数 2783 浏览 149 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

0 文章
0 评论
23 人气
更多

推荐作者

胡图图

文章 0 评论 0

zt006

文章 0 评论 0

z祗昰~

文章 0 评论 0

冰葑

文章 0 评论 0

野の

文章 0 评论 0

天空

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文