JavaScript中比较对象的几种方式


当前第2页 返回上一页

另一方面,由于 hero1hero3 具有不同的属性,所以 shallowEqual(hero1, hero3) 将会返回 false

但是 JavaScript 中的对象是可以嵌套的。在这种情况下,浅层比较并不能很好地发挥作用。

下面对具有嵌套对象的对象执行浅层比较检查:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

const hero1 = {

  name: 'Batman',

  address: {

    city: 'Gotham'

  }

};

const hero2 = {

  name: 'Batman',

  address: {

    city: 'Gotham'

  }

};

 

shallowEqual(hero1, hero2); // => false

这次,即使两个对象 hero1hero2 具有相同的内容,shallowEqual(hero1, hero2) 也将会返回 false

发生这种情况是因为嵌套对象 hero1.addresshero2.address 是不同的对象实例。因此,浅层比较认为 hero1.addresshero2.address 是两个不同的值。

解决嵌套对象的问题需要进行深层比较。

4.深层比较

深层比较与浅层比较相似,不同之处在于,当属性中包含对象时,将对嵌套对象执行递归浅层比较。

看一下深层比较的实现:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

function deepEqual(object1, object2) {

  const keys1 = Object.keys(object1);

  const keys2 = Object.keys(object2);

 

  if (keys1.length !== keys2.length) {

    return false;

  }

 

  for (let index = 0; index < keys1.length; index++) {

    const val1 = object1[keys1[index]];

    const val2 = object2[keys2[index]];

    const areObjects = isObject(val1) && isObject(val2);

    if (areObjects && !deepEqual(val1, val2) ||

        !areObjects && val1 !== val2) {

      return false;

    }

  }

 

  return true;

}

 

function isObject(object) {

  return object != null && typeof object === 'object';

}

第 13 行的 areObjects && !deepEqual(val1, val2) 一旦检查到的属性是对象,则递归调用将会开始验证嵌套对象是否也相等。

现在用 deepEquality() 比较具有嵌套对象的对象:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

const hero1 = {

  name: 'Batman',

  address: {

    city: 'Gotham'

  }

};

const hero2 = {

  name: 'Batman',

  address: {

    city: 'Gotham'

  }

};

 

deepEqual(hero1, hero2); // => true

深度比较函数能够正确地确定 hero1hero2 是否具有相同的属性和值,包括嵌套对象 hero1.addresshero2.address 的相等性。

为了深入比较对象,我建议使用Node内置util模块的 isDeepStrictEqual(object1, object2)lodash 库的 _.isEqual(object1, object2)

5. 总结

引用相等性(使用 =====Object.is())用来确定操作数是否为同一个对象实例。

手动检查对象是否相等,需要对属性值进行手动比较。尽管这类检查需要手动编码来对属性进行比较,但由于很简单,所以这种方法很方便。

当被比较的对象有很多属性或在运行时确定对象的结构时,更好的方法是使用浅层检查。

如果比较的对象具有嵌套对象,则应该进行深度比较检查。

英文原文地址:https://dmitripavlutin.com/how-to-compare-objects-in-javascript/

作者:Dmitri Pavlutin

译文地址:https://segmentfault.com/a/1190000022913676

更多编程相关知识,请访问:编程入门!!

以上就是JavaScript中比较对象的几种方式的详细内容,更多文章请关注木庄网络博客

返回前面的内容

相关阅读 >>

javascript中blur是什么

javascript如何判断字符串中是否包含某个字符串

javascript关于数组的方法有哪些不同之处?

javascript中的垃圾回收和内存泄漏

javascript与java区别是什么

javascript有数据类型么

介绍javascript作用域和闭包

javascript怎么判断数据类型

js如何判断值是否数字

es6中变量的解构赋值的用法介绍(附代码)

更多相关阅读请进入《javascript》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...