tool.ts 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. export function debounce(fn: (...args: any[]) => void, delay: number) {
  2. let timeout: NodeJS.Timeout;
  3. const debounceFn = (...args: any[]) => {
  4. clearTimeout(timeout);
  5. timeout = setTimeout(() => {
  6. fn.apply(undefined, args);
  7. }, delay);
  8. };
  9. debounceFn.cancel = () => {
  10. clearTimeout(timeout);
  11. };
  12. return debounceFn;
  13. }
  14. export function throttle(fn: (...args: any[]) => void, delay: number, immediate = true) {
  15. let timeout: NodeJS.Timeout | null = null;
  16. return (...args: any[]) => {
  17. if (!timeout) {
  18. timeout = setTimeout(() => {
  19. timeout = null;
  20. !immediate && fn.apply(undefined, args);
  21. }, delay);
  22. immediate && fn.apply(undefined, args);
  23. }
  24. };
  25. }
  26. export function get<T = any>(obj: any, path: string[], defaultValue?: any): T {
  27. let value = obj;
  28. for (const prop of path) {
  29. value = value[prop];
  30. if (value === undefined) {
  31. return defaultValue !== undefined ? defaultValue : undefined;
  32. }
  33. }
  34. return value;
  35. }
  36. export function set(obj: any, path: string[], value: any): void {
  37. let current = obj;
  38. for (let i = 0; i < path.length; i++) {
  39. const prop = path[i];
  40. if (i === path.length - 1) {
  41. current[prop] = value;
  42. } else {
  43. if (!current[prop]) {
  44. current[prop] = {};
  45. }
  46. current = current[prop];
  47. }
  48. }
  49. }
  50. export function isEqual<T>(value1: T, value2: T): boolean {
  51. if (typeof value1 !== 'object' || value1 === null || typeof value2 !== 'object' || value2 === null) {
  52. return value1 === value2;
  53. }
  54. if (Array.isArray(value1)) {
  55. if (!Array.isArray(value2) || value1.length !== value2.length) {
  56. return false;
  57. }
  58. for (let i = 0; i < value1.length; i++) {
  59. if (!isEqual(value1[i], value2[i])) {
  60. return false;
  61. }
  62. }
  63. return true;
  64. }
  65. const keys1 = Object.keys(value1);
  66. const keys2 = Object.keys(value2);
  67. if (keys1.length !== keys2.length) {
  68. return false;
  69. }
  70. for (const key of keys1) {
  71. // eslint-disable-next-line @typescript-eslint/ban-ts-comment
  72. // @ts-expect-error
  73. if (!isEqual(value1[key], value2[key])) {
  74. return false;
  75. }
  76. }
  77. return true;
  78. }
  79. export function clone<T>(value: T): T {
  80. if (typeof value !== 'object' || value === null) {
  81. return value;
  82. }
  83. if (Array.isArray(value)) {
  84. return value.map((item) => clone(item)) as any;
  85. }
  86. const result: any = {};
  87. for (const key in value) {
  88. result[key] = clone(value[key]);
  89. }
  90. return result;
  91. }