tool.ts 2.1 KB

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