From c89223e509d79e829df2ffda086aa0ed87b30918 Mon Sep 17 00:00:00 2001 From: Artemiy Date: Tue, 28 Jan 2020 17:07:22 +0800 Subject: [PATCH] feat(util): add debounce util --- packages/utils/src/debounce.ts | 8 ++++++ packages/utils/src/deepmerge.ts | 43 ++++++++++++++++++++++++++++++ packages/utils/src/index.ts | 46 ++------------------------------- 3 files changed, 53 insertions(+), 44 deletions(-) create mode 100644 packages/utils/src/debounce.ts create mode 100644 packages/utils/src/deepmerge.ts diff --git a/packages/utils/src/debounce.ts b/packages/utils/src/debounce.ts new file mode 100644 index 000000000..45fa1c949 --- /dev/null +++ b/packages/utils/src/debounce.ts @@ -0,0 +1,8 @@ +export function debounce(cb: T, wait = 10) { + let h = 0; + const callable = (...args: any) => { + clearTimeout(h); + h = window.setTimeout(() => cb(...args), wait); + }; + return (callable as any) as T; +} diff --git a/packages/utils/src/deepmerge.ts b/packages/utils/src/deepmerge.ts new file mode 100644 index 000000000..15bd07f9b --- /dev/null +++ b/packages/utils/src/deepmerge.ts @@ -0,0 +1,43 @@ +export function deepmerge(target: any, src: any, mergeArray = false): any { + const array = Array.isArray(src); + let dst: any = (array && []) || {}; + + if (array) { + if (mergeArray) { + target = target || []; + dst = dst.concat(target); + src.forEach(function(e: any, i: any) { + if (typeof dst[i] === 'undefined') { + dst[i] = e; + } else if (typeof e === 'object') { + dst[i] = deepmerge(target[i], e, mergeArray); + } else { + if (target.indexOf(e) === -1) { + dst.push(e); + } + } + }); + } else { + // Replace array. Do not merge by default + dst = src; + } + } else { + if (target && typeof target === 'object') { + Object.keys(target).forEach(function(key) { + dst[key] = target[key]; + }); + } + Object.keys(src).forEach(function(key) { + if (typeof src[key] !== 'object' || !src[key]) { + dst[key] = src[key]; + } else { + if (typeof target[key] === 'object' && typeof src[key] === 'object') { + dst[key] = deepmerge(target[key], src[key], mergeArray); + } else { + dst[key] = src[key]; + } + } + }); + } + return dst; +} diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index 62e2299d1..cf333ebaa 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -6,6 +6,8 @@ import * as Dom from './dom'; export const dom = Dom; export * from './clipboard'; export * from './events'; +export { deepmerge } from './deepmerge'; +export { debounce } from './debounce'; /** * Given an array of member function names as strings, replace all of them * with bound versions that will always refer to `context` as `this`. This @@ -30,47 +32,3 @@ export function fixUrlStr(url: string): string { // remove double slash return url.replace(/([^:]\/)\/+/g, '$1'); } - -export function deepmerge(target: any, src: any, mergeArray = false): any { - const array = Array.isArray(src); - let dst: any = (array && []) || {}; - - if (array) { - if (mergeArray) { - target = target || []; - dst = dst.concat(target); - src.forEach(function(e: any, i: any) { - if (typeof dst[i] === 'undefined') { - dst[i] = e; - } else if (typeof e === 'object') { - dst[i] = deepmerge(target[i], e, mergeArray); - } else { - if (target.indexOf(e) === -1) { - dst.push(e); - } - } - }); - } else { - // Replace array. Do not merge by default - dst = src; - } - } else { - if (target && typeof target === 'object') { - Object.keys(target).forEach(function(key) { - dst[key] = target[key]; - }); - } - Object.keys(src).forEach(function(key) { - if (typeof src[key] !== 'object' || !src[key]) { - dst[key] = src[key]; - } else { - if (typeof target[key] === 'object' && typeof src[key] === 'object') { - dst[key] = deepmerge(target[key], src[key], mergeArray); - } else { - dst[key] = src[key]; - } - } - }); - } - return dst; -}