
本文介绍如何通过一次遍历高效统计并分组具有不同 statusid 的请求对象,避免多次调用 filter 导致的性能浪费,显著提升大数据量下的执行效率。
本文介绍如何通过一次遍历高效统计并分组具有不同 statusid 的请求对象,避免多次调用 filter 导致的性能浪费,显著提升大数据量下的执行效率。
在处理大型请求数组(如 details.request)时,频繁使用 .filter() 进行多轮条件筛选会带来明显的性能开销:每次调用都需完整遍历整个数组,时间复杂度为 O(n × k)(k 为 filter 次数)。针对本例中需按 statusId 归类“Total”“In-Progress”“Success”“Failed”四类并同时获取数量与对象列表的需求,最优解是单次遍历 + 分支累积。
以下是一个结构清晰、类型安全、可复用的优化实现:
function partitionRequests(details: { request: Array }) {
const { request } = details;
let inProgressCount = 0;
let successCount = 0;
let failedCount = 0;
const successAdditionalObj: typeof request = [];
const failedAdditionalObj: typeof request = [];
for (const req of request) {
switch (req.statusId) {
case 0:
case 1:
case 3:
case 4:
inProgressCount++;
break;
case 6:
successCount++;
successAdditionalObj.push(req);
break;
case 2:
case 5:
failedCount++;
failedAdditionalObj.push(req);
break;
// 其他 statusId 忽略(如 Total 已由 request.length 覆盖)
}
}
return [
{ label: 'Total', count: request.length },
{ label: 'In-Progress', count: inProgressCount },
{
label: 'Success',
count: successCount,
additionalObj: successAdditionalObj
},
{
label: 'Failed',
count: failedCount,
additionalObj: failedAdditionalObj
}
];
}
// 使用方式
this.data = partitionRequests(details);
✅ 关键优化点说明:
- 时间复杂度从 O(7n) 降至 O(n):原代码含 5 次 filter()(In-Progress ×1、Success ×2、Failed ×2),现仅需 1 次循环;
- 内存更友好:避免中间数组创建(filter 每次返回新数组),push() 复用预分配容器;
- 逻辑更健壮:switch 显式覆盖所有目标状态,default 可选添加日志便于调试未知状态;
- 类型推导友好:TypeScript 下自动继承 request 元素类型,无需重复断言。
⚠️ 注意事项:
- 若需支持动态状态映射(如未来新增 statusId=7 为 “Cancelled”),建议将状态配置外提为 Map 或配置对象,保持扩展性;
- 对超大数组(>10 万项),可考虑 for (let i = 0; i
- “Total” 严格等于 request.length,不依赖任何过滤逻辑,确保数据一致性。
该方案兼顾可读性、性能与可维护性,是处理同类分组统计场景的推荐实践。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











