js判断两个对象是否相等---2种方式

本是古典 何须时尚 2022-12-11 09:20 330阅读 0赞

1、JSON.stringify(obj)

这种方法,简单一行代码就搞定。
但有一个缺点:当对象里key值的顺序不一致时,比较就会出问题了。并且在JSON.stringify()时,一些特殊类型的值,比如undefinedDateRegExp等会丢失或者变形。

  1. var obj1={
  2. name:111,
  3. age:222,
  4. dis:[1,2,3,4],
  5. info:{
  6. like:"hx",
  7. arr:[1,2,3,4]
  8. }
  9. }
  10. var obj2={
  11. name:111,
  12. age:222,
  13. dis:[1,2,3,4],
  14. info:{
  15. like:"hx",
  16. arr:[1,2,3,4]
  17. }
  18. }
  19. console.log(JSON.stringify(obj1)==JSON.stringify(obj2));

2、递归

使用递归来判断两个对象是否相等。现有对象obj1obj2
对象里,值的类型包括undefinednullnumberstringbooleanDateArray和对象。数组项也有可能是简单类型、数组甚至对象 。
默认输入的两个参数是对象了,就不做判断了。。。。。。。。

2.1、实现思路
  1. 先判断两个对象的key值的长度。若长度不相等,则 return false
  2. 遍历对象obj1,检查对象obj2中是否有对应的key值, 没有,则return false
  3. 比较两个对象中这个key对应的值的类型是否相等,不相等,则return false
  4. 如果值的类型是undefinednumberstringboolean的一种,直接两个值比较,不同,则return false
  5. 如果值是null,那么 比较两个值是否相等。不等,则return false
  6. 如果值是Date类型的,
  7. 如果值是对象,调用自身
  8. 如果值是数组,因为数组项可能是任意一种数据类型的,所以还是先比较长度,长度相等后再逐一比较数组的每一项。
2.2、代码部分
  1. var obj1 = {
  2. name: 111,
  3. age: 222,
  4. arr: [1, 2, 3, 4],
  5. info: {
  6. name: "iii",
  7. arr: [1, 2, 3, [1, 2], { name: 222 }]
  8. }
  9. }
  10. var obj2 = {
  11. name: 111,
  12. arr: [1, 2, 3, 4],
  13. age: 222,
  14. info: {
  15. name: "iii",
  16. arr: [1, 2, 3, [1, 2], { name: 222 }]
  17. }
  18. }
  19. // 假设对象内值的类型有:undefined、null、string、boolean、number、对象、数组和Date
  20. function objEqual(obj1, obj2) {
  21. let flag = true;
  22. // 先判断,key的长度是否相等,
  23. if (Object.getOwnPropertyNames(obj1).length !== Object.getOwnPropertyNames(obj2).length) {
  24. return false;
  25. }
  26. for (let key in obj1) {
  27. // 先看看 两个对象中是否都包含这个key
  28. if (!obj2.hasOwnProperty(key)) { // obj2 没有这个key
  29. return false;
  30. }
  31. const type1 = typeof obj1[key];
  32. const type2 = typeof obj2[key];
  33. if (type1 !== type2) { // 有这个key,但是 值的类型不同
  34. return false;
  35. }
  36. flag = judge(obj1, obj2, key, type1, type2);
  37. if (!flag) {
  38. return false;
  39. }
  40. }
  41. return true;
  42. }
  43. function judge(obj1, obj2, key, type1, type2) {
  44. let flag = true;
  45. if (type1 === "string" || type1 === "number" || type1 === "boolean" || type1 === "undefined") { // 如果值 是简单类型,
  46. if (obj1[key] !== obj2[key]) {
  47. flag = false;
  48. }
  49. } else if (type1 === "object" && obj1[key] === null) { // 如果值是 null
  50. if (obj2[key] !== null) {
  51. flag= false;
  52. }
  53. } else if (type1 === "object" && type1 instanceof Date) { // 如果值 是日期
  54. if (!type2 instanceof Date) {
  55. flag = false;
  56. }
  57. if (obj1[key] !== obj2[key]) {
  58. flag = false;
  59. }
  60. } else if (type1 === "object" && !Array.isArray(obj1[key])) { // 如果值 是个对象
  61. if (Array.isArray(obj2[key])) { //
  62. flag = false;
  63. } else {
  64. const result = objEqual(obj1[key], obj2[key]);
  65. flag = result;
  66. }
  67. } else if (type1 === "object" && Array.isArray(obj1[key])) { // 值是数组
  68. if (!Array.isArray(obj2[key])) {
  69. return false;
  70. } else if (obj1[key].length !== obj2[key].length) { // 数组项项数不一样啊
  71. return false;
  72. } else {
  73. for (let i = 0; i < obj1[key].length; i++) {
  74. const type11 = typeof obj1[key][i];
  75. const type22 = typeof obj2[key][i];
  76. //arr: [1, 2, [1, 2, 3], { name: 554 }]
  77. const result = judge(obj1[key], obj2[key], i, type11, type22);
  78. if(!result){
  79. return result
  80. }
  81. flag = result;
  82. }
  83. }
  84. }
  85. return flag;
  86. }
  87. const result = objEqual(obj1, obj2);
  88. console.log(result, "--------------两个对象是否相等");
2.3 测试数据
  1. // 1----true
  2. var obj1 = {
  3. name: 111,
  4. age: 222,
  5. }
  6. var obj2 = {
  7. name: 111,
  8. age: 222,
  9. }
  10. // 2---true
  11. var obj1 = {
  12. name: 111,
  13. hi:new Date(),
  14. age: 222,
  15. }
  16. var obj2 = {
  17. name: 111,
  18. age: 222,
  19. hi:new Date()
  20. }
  21. // 3---false
  22. var obj1 = {
  23. name: 111,
  24. hi:new Date(),
  25. }
  26. var obj2 = {
  27. name: 111,
  28. age: 222,
  29. hi:new Date()
  30. }
  31. // 4---true
  32. var obj1 = {
  33. name: 111,
  34. hi:new Date(),
  35. age:222,
  36. arr: [1, 2, 3, 4],
  37. }
  38. var obj2 = {
  39. name: 111,
  40. age: 222,
  41. hi:new Date(),
  42. arr: [1, 2, 3, 4],
  43. }
  44. // 5---false
  45. var obj1 = {
  46. name: 111,
  47. hi:new Date(),
  48. age:222,
  49. arr: [1, 2, 2, 4],
  50. }
  51. var obj2 = {
  52. name: 111,
  53. age: 222,
  54. hi:new Date(),
  55. arr: [1, 2, 3, 4],
  56. }
  57. // 6---false
  58. var obj1 = {
  59. name: 111,
  60. hi:new Date(),
  61. age:222,
  62. arr: [1, 2, 2, 4],
  63. info: {
  64. name: "ii8i",
  65. }
  66. }
  67. var obj2 = {
  68. name: 111,
  69. age: 222,
  70. hi:new Date(),
  71. arr: [1, 2, 3, 4],
  72. info: {
  73. name: "iii",
  74. }
  75. }
  76. // 7---false
  77. var obj1 = {
  78. name: 111,
  79. hi:new Date(),
  80. age:222,
  81. arr: [1, 2, 2, 4],
  82. info: {
  83. name: "ii8i",
  84. arr: [1, 2, 3, [1, 2] ]
  85. }
  86. }
  87. var obj2 = {
  88. name: 111,
  89. age: 222,
  90. hi:new Date(),
  91. arr: [1, 2, 3, 4],
  92. info: {
  93. name: "iii",
  94. arr: [1, 2, 3, [1, 2], { name: 222 }]
  95. }
  96. }
  97. // 8---true
  98. var obj1 = {
  99. name: 111,
  100. hi:new Date(),
  101. age:222,
  102. arr: [1, 2, 3, 4],
  103. info: {
  104. name: "iii",
  105. arr: [1, 2, 3, [1, 2] ,{ name: 222 }]
  106. }
  107. }
  108. var obj2 = {
  109. name: 111,
  110. age: 222,
  111. hi:new Date(),
  112. arr: [1, 2, 3, 4],
  113. info: {
  114. name: "iii",
  115. arr: [1, 2, 3, [1, 2], { name: 222 }]
  116. }
  117. }

发表评论

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

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

相关阅读

    相关 js比较对象是否相等

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