diff.ts 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import { toRawType } from "./basic";
  2. // 是否修改
  3. const _deepIsRevise = (
  4. raw1: any,
  5. raw2: any,
  6. readly: Set<[any, any]>
  7. ): boolean => {
  8. if (raw1 === raw2) return false;
  9. const rawType1 = toRawType(raw1);
  10. const rawType2 = toRawType(raw2);
  11. if (rawType1 !== rawType2) {
  12. return true;
  13. } else if (
  14. rawType1 === "String" ||
  15. rawType1 === "Number" ||
  16. rawType1 === "Boolean"
  17. ) {
  18. if (rawType1 === "Number" && isNaN(raw1) && isNaN(raw2)) {
  19. return false;
  20. } else {
  21. return raw1 !== raw2;
  22. }
  23. }
  24. const rawsArray = Array.from(readly.values());
  25. for (const raws of rawsArray) {
  26. if (raws.includes(raw1) && raws.includes(raw2)) {
  27. return false;
  28. }
  29. }
  30. readly.add([raw1, raw2]);
  31. if (rawType1 === "Array") {
  32. return (
  33. raw1.length !== raw2.length ||
  34. raw1.some((item1: any, i: number) =>
  35. _deepIsRevise(item1, raw2[i], readly)
  36. )
  37. );
  38. } else if (rawType1 === "Object") {
  39. const rawKeys1 = Object.keys(raw1).sort();
  40. const rawKeys2 = Object.keys(raw2).sort();
  41. return (
  42. _deepIsRevise(rawKeys1, rawKeys2, readly) ||
  43. rawKeys1.some((key) => _deepIsRevise(raw1[key], raw2[key], readly))
  44. );
  45. } else if (rawType1 === "Map") {
  46. const rawKeys1 = Array.from(raw1.keys()).sort();
  47. const rawKeys2 = Array.from(raw2.keys()).sort();
  48. return (
  49. _deepIsRevise(rawKeys1, rawKeys2, readly) ||
  50. rawKeys1.some((key) =>
  51. _deepIsRevise(raw1.get(key), raw2.get(key), readly)
  52. )
  53. );
  54. } else if (rawType1 === "Set") {
  55. return deepIsRevise(Array.from(raw1.values()), Array.from(raw2.values()));
  56. } else {
  57. return raw1 !== raw2;
  58. }
  59. };
  60. export const deepIsRevise = (raw1: any, raw2: any) =>
  61. _deepIsRevise(raw1, raw2, new Set());
  62. export const diffArrayChange = <T extends Array<any>>(
  63. newItems: T,
  64. oldItems: T
  65. ) => {
  66. const addedItems = [] as unknown as T;
  67. const deletedItems = [] as unknown as T;
  68. for (const item of newItems) {
  69. if (!oldItems.includes(item)) {
  70. addedItems.push(item);
  71. }
  72. }
  73. for (const item of oldItems) {
  74. if (!newItems.includes(item)) {
  75. deletedItems.push(item);
  76. }
  77. }
  78. return {
  79. added: addedItems,
  80. deleted: deletedItems,
  81. };
  82. };