export function generateId() { return Math.random().toString(36).slice(3, 20); } export function deepFilter, K extends keyof T>( data: T[], predicate: (item: T) => boolean, mapKey: K, ): T[] { return data.reduce((all, item) => { const isTrue = predicate(item); const children = deepFilter(item[mapKey], predicate, mapKey); if (isTrue || children.length > 0) { all.push({ ...item, [mapKey]: children, }); return all; } return all; }, [] as T[]); }