tool.ts 2.3 KB

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