比对.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. /*
  2. * @Description:
  3. * @Autor: kindring
  4. * @Date: 2021-09-30 10:36:44
  5. * @LastEditors: kindring
  6. * @LastEditTime: 2021-10-15 17:32:22
  7. * @LastDescript:
  8. */
  9. // 判断最终值是否相同
  10. function isEqual(obj1, obj2) {
  11. if (obj1 instanceof Array) {
  12. if (obj1.length != obj2.length) {
  13. return false
  14. }
  15. for (let index = 0; index < obj1.length; index++) {
  16. if (obj1[index] instanceof Object) {
  17. if (!isEqual(obj1[index], obj2[index])) {
  18. return false
  19. }
  20. } else {
  21. if (obj1[index] != obj2[index]) {
  22. return false
  23. }
  24. }
  25. }
  26. } else if (obj1 instanceof Object) {
  27. if (Object.keys(obj1).length != Object.keys(obj2).length) {
  28. console.log('对象值数量不一致');
  29. return false
  30. }
  31. for (let key in obj1) {
  32. // 防止循环引用
  33. if (obj1[key] instanceof Object) {
  34. if (!isEqual(obj1[key], obj2[key])) {
  35. return false
  36. }
  37. } else {
  38. if (obj1[key] != obj2[key]) {
  39. return false
  40. }
  41. }
  42. }
  43. } else {
  44. return obj1 == obj2
  45. }
  46. return true
  47. }
  48. console.log(isEqual(1, 2)); // false
  49. console.log(isEqual([1, 2], [1, 2])); // true
  50. console.log(isEqual([1], [1, 2])); // false
  51. console.log(isEqual([{ a: 1, b: 2 }], [{ a: 1, b: 2 }])); // true
  52. console.log(isEqual([{ a: 1, b: 2 }], [{ a: 1, b: 1 }])); // false
  53. console.log(isEqual([{ a: 1, b: 2 }], [{ a: 1 }])); // false
  54. console.log(isEqual({ a: 1, b: 2, c: [1, 2] }, { a: 1, b: 2, c: [1, 2] })); // true
  55. function deepClone(object, weakMap = new WeakMap()) {
  56. if (typeof object === 'object') {
  57. let cloneTarget = Array.isArray(object) ? [] : {}
  58. if (weakMap.get(object)) {
  59. return weakMap.get(object)
  60. }
  61. console.log();
  62. weakMap.set(object, cloneTarget)
  63. for (const key in object) {
  64. cloneTarget[key] = deepClone(object[key], weakMap)
  65. }
  66. return cloneTarget
  67. } else {
  68. return object
  69. }
  70. }
  71. let o1 = { a: 1, b: [{ c: 2, d: 3 }] }
  72. console.log(o1);
  73. let o2 = deepClone(o1)
  74. console.log(o2);
  75. o1.a = 3;
  76. console.log(o2);