js判断两个对象是否相等的办法,包含绝对相等和形状内容相等

小鱼儿 2021-07-24 18:42 534阅读 0赞

在js中对象是引用类型,对象要相等除非是同一个引用,不然就不会相等,如下:

  1. var obj1={0:'a',1:'b',2:'c'}
  2. var obj2={0:'a',1:'b',2:'c'}
  3. console.log(obj1==obj2)
  4. console.log(obj1===obj2)

打印都为false,虽然他们模样一样,当需要判断对象的形状和内容都一样的时候,就比如上面的obj1、obj2,怎么办呢?它来了

完整代码:

  1. //判断两个对象是否相同(包含绝对相等和他们是否有相同的形状)
  2. function looseEqual (a, b) {
  3. if (a === b) { //如果是绝对相等就直接返回true
  4. return true ;
  5. }
  6. //如果不是绝对相等就哦按的他们是否有相同的形状
  7. var isObjectA = isObject(a);
  8. var isObjectB = isObject(b);
  9. if (isObjectA && isObjectB) {//两个均是对象
  10. try {
  11. var isArrayA = Array.isArray(a);
  12. var isArrayB = Array.isArray(b);
  13. if (isArrayA && isArrayB) {//如果都是数组
  14. if(a.length === b.length){//如果长度相等
  15. return a.every(function (e, i) {//用every和递归来比对a数组和b数组的每个元素,并返回
  16. return looseEqual(e, b[i])
  17. })
  18. }
  19. //长度都不等直接返回false
  20. return false;
  21. } else if (a instanceof Date && b instanceof Date) {//如果是Date 则直接getTime 比较
  22. return a.getTime() === b.getTime()
  23. } else if (!isArrayA && !isArrayB) {//对象的比较
  24. //拿到两个对象的key
  25. var keysA = Object.keys(a);
  26. var keysB = Object.keys(b);
  27. if(keysA.length === keysB.length){//如果keys相等
  28. return keysA.every(function (key) {//用every和递归来比对a对象和b对象的每个元素值,并返回
  29. return looseEqual(a[key], b[key]);
  30. })
  31. }
  32. //长度都不等直接返回false
  33. return false;
  34. } else {
  35. return false
  36. }
  37. } catch (e) {
  38. return false
  39. }
  40. } else if (!isObjectA && !isObjectB) {//如果都不是对象则按String来处理
  41. return String(a) === String(b)
  42. } else {
  43. return false
  44. }
  45. }
  46. function isObject (obj) {
  47. return obj !== null && typeof obj === 'object'
  48. }

测试一波:

  1. //字符
  2. var str1="abc";
  3. var str2="abc";
  4. console.log(looseEqual(str1,str2))
  5. //数字
  6. var num1=12222;
  7. var num2=12222;
  8. console.log(looseEqual(num1,num2))
  9. //对象
  10. var obj1={0:'a',1:'b',2:'c'}
  11. var obj2={0:'a',1:'b',2:'c'}
  12. console.log(looseEqual(obj1,obj2))
  13. //对象嵌套数组
  14. var obj1={0:'a',1:'b',2:[1,2,3]}
  15. var obj2={0:'a',1:'b',2:[1,2,3]}
  16. console.log(looseEqual(obj1,obj2))
  17. //类数组
  18. var a={0:'a',1:'b',2:'c','length':3}
  19. var b={0:'a',1:'b',2:'c','length':3}
  20. console.log(looseEqual(a,b))
  21. //数组
  22. var list=[1,2,3,4]
  23. var list1=[1,2,3,4]
  24. console.log(looseEqual(list,list1))
  25. //数组嵌套
  26. list=[1,2,3,[6,7]]
  27. list1=[1,2,3,[6,7]]
  28. console.log(looseEqual(list,list1))
  29. //数组嵌套对象
  30. list=[1,2,3,{a:'1',b:'7'}]
  31. list1=[1,2,3,{a:'1',b:'7'}]
  32. console.log(looseEqual(list,list1))
  33. var d1 = new Date();
  34. var d2 = new Date();
  35. console.log(looseEqual(d1,d2))
  36. var d3 = new Date();
  37. var d4 ;
  38. //使用延时来赋值d4
  39. setTimeout(function(){
  40. d4 = new Date();
  41. console.log(looseEqual(d3,d4))
  42. },1);

输出结果:

20201223154806419.png

除了最后一个时间的,我们用了setTimeout来验证以外,其他的都是通过的,这个应该可以做蛮好的工具函数了吧,哈哈!!

欢迎交流!!

发表评论

表情:
评论列表 (有 0 条评论,534人围观)

还没有评论,来说两句吧...

相关阅读

    相关 判断List是否相等

    最近一位同学在面试时被问到如何比较两个list是否相等?Java中的list是按自然顺序排列的。因此,如果两个list包含相同顺序的完全相同的元素,则认为它们是相等的,如果忽略

    相关 js比较对象是否相等

    > 前言:如何判断两个对象是否相等? 两个Object类型对象,即使拥有相同属性、相同值,当使用 == 或 === 进行比较时,也不认为他们相等。这就是因为他们是通过引用(内