请求对API路径数组进行相似字符串聚类并按模板汇总数值
API路径聚类与计数汇总实现
给定如下格式的API路径计数数组:
{ "/core/api/v2.0/wallet/62da5521930eaf0f2e855": 1, "/core/api/v2.0/wallet/62da382894c5dd0f9ab11": 1, "/core/api/v2.0/users/sync/603a9c6a-c686-42af-b5f7-1f5bcfd75": 1, "/core/api/v2.0/users/sync/64c73c5b-e6cc-4f98-9c54-69e7c796a": 3, "/core/api/v2.0/users/sync/c3dfe00d-3950-401b-b068-d64aac99f39c": 3, "/core/api/v2.0/users/sync/32cd70c8-ca92-4075-bb2f-1b9d99527723": 2, "/core/api/v2.0/users/sync/245b0029-c05b-4007-bacb-656db21c170e": 1, "/core/api/v2.0/users/sync/9175d6a9-386c-4b0d-9db4-c6053913c354": 1, "/core/api/v2.0/tools/generate/trigger-download": 22, "/core/api/v2.0/tools/generate/search-photos": 17 }需要将路径中的唯一标识替换为占位符并汇总计数,期望结果:
{ "/core/api/v2.0/wallet/:id": 2, "/core/api/v2.0/users/sync/:id": 11, "/core/api/v2.0/tools/generate/:tool-name": 39 }
实现代码
function clusterAPIPaths(apiCounts) { const clustered = {}; // 判断是否为唯一标识的辅助函数 function isUniqueId(segment) { const uuidPattern = /^[0-9a-f]{8}-?[0-9a-f]{4}-?[0-9a-f]{4}-?[0-9a-f]{4}-?[0-9a-f]{12}$/i; const longRandomPattern = /^[0-9a-f]{16,}$/i; return uuidPattern.test(segment) || longRandomPattern.test(segment); } // 遍历处理每个API路径 for (const [path, count] of Object.entries(apiCounts)) { const segments = path.split('/').filter(s => s); let normalizedSegments = [...segments]; const lastSegment = normalizedSegments.at(-1); // 替换唯一标识为对应占位符 if (isUniqueId(lastSegment)) { const prefix = normalizedSegments.slice(0, -1).join('/'); if (prefix.includes('/tools/generate/')) { normalizedSegments[normalizedSegments.length - 1] = ':tool-name'; } else { normalizedSegments[normalizedSegments.length - 1] = ':id'; } } const normalizedPath = '/' + normalizedSegments.join('/'); // 累加计数 clustered[normalizedPath] = (clustered[normalizedPath] || 0) + count; } return clustered; } // 测试示例 const input = { "/core/api/v2.0/wallet/62da5521930eaf0f2e855": 1, "/core/api/v2.0/wallet/62da382894c5dd0f9ab11": 1, "/core/api/v2.0/users/sync/603a9c6a-c686-42af-b5f7-1f5bcfd75": 1, "/core/api/v2.0/users/sync/64c73c5b-e6cc-4f98-9c54-69e7c796a": 3, "/core/api/v2.0/users/sync/c3dfe00d-3950-401b-b068-d64aac99f39c": 3, "/core/api/v2.0/users/sync/32cd70c8-ca92-4075-bb2f-1b9d99527723": 2, "/core/api/v2.0/users/sync/245b0029-c05b-4007-bacb-656db21c170e": 1, "/core/api/v2.0/users/sync/9175d6a9-386c-4b0d-9db4-c6053913c354": 1, "/core/api/v2.0/tools/generate/trigger-download": 22, "/core/api/v2.0/tools/generate/search-photos": 17 }; console.log(clusterAPIPaths(input));
实现思路
- 唯一标识识别:通过正则匹配UUID格式(含连字符/不含)和长随机字符串,判断路径最后一段是否为唯一标识
- 路径标准化:根据路径前缀替换唯一标识为对应占位符(工具类路径用
:tool-name,其余用:id) - 计数汇总:以标准化后的路径为键,累加所有同类型路径的访问计数
内容的提问来源于stack exchange,提问作者Talha nousher
相关产品推荐
相关产品推荐

