Hi, I'm
> front-end-developer
// find my profile on Github:
const githubLink = "https://github.com/lurx";
debounce
export function debounce<T extends (...args: unknown[]) => void>(
fn: T,
delay: number,
): (...args: Parameters<T>) => void {
let timerId: Nullable<ReturnType<typeof setTimeout>> = null;
return (...args: Parameters<T>) => {
if (timerId !== null) clearTimeout(timerId);
timerId = setTimeout(() => {
fn(...args);
}, delay);
};
}
throttle
export function throttle<T extends (...args: unknown[]) => void>(
fn: T,
limit: number,
): (...args: Parameters<T>) => void {
let lastCall = -Infinity;
return (...args: Parameters<T>) => {
const now = Date.now();
if (now - lastCall >= limit) {
lastCall = now;
fn(...args);
}
};
}
deep-clone
export function deepClone<T>(value: T): T {
if (value === null || typeof value !== 'object') return value;
if (Array.isArray(value)) return value.map(deepClone) as T;
return Object.fromEntries(
Object.entries(value as Record<string, unknown>).map(([key, val]) => [
key,
deepClone(val),
]),
) as T;
}
flatten
export function flatten<T>(arr: (T | T[])[]): T[] {
return arr.reduce<T[]>(
(acc, item) =>
acc.concat(Array.isArray(item) ? flatten(item as (T | T[])[]) : item),
[],
);
}
group-by
export function groupBy<T>(arr: T[], key: keyof T): Record<string, T[]> {
return arr.reduce<Record<string, T[]>>((acc, item) => {
const group = String(item[key]);
if (!acc[group]) acc[group] = [];
acc[group].push(item);
return acc;
}, {});
}
memoize
export function memoize<T extends (...args: unknown[]) => unknown>(fn: T): T {
const cache = new Map<string, ReturnType<T>>();
return ((...args: Parameters<T>): ReturnType<T> => {
const key = JSON.stringify(args);
if (cache.has(key)) return cache.get(key) as ReturnType<T>;
const result = fn(...args) as ReturnType<T>;
cache.set(key, result);
return result;
}) as T;
}
chunk
export function chunk<T>(arr: T[], size: number): T[][] {
if (size <= 0) throw new RangeError('Chunk size must be greater than 0');
const result: T[][] = [];
for (let index = 0; index < arr.length; index += size) {
result.push(arr.slice(index, index + size));
}
return result;
}