如何按empId、projectId过滤对象数组并筛选总工时小于4的任务
按员工ID和项目ID分组筛选任务数组
需求说明
将存储单个任务的对象数组按以下逻辑处理:
- 按
empId(员工ID)与projectId(项目ID)组合分组 - 统计每组的总工时(需将字符串类型的
total转为数字计算) - 若组内总工时小于4,保留该组所有任务
- 若某任务是对应
empId+projectId的唯一任务,直接判断其工时是否小于4,符合条件则保留
输入数据
const nonallocated = [ { empId: "1", task: { project: { projectId: "111" }, total: '2' } }, { empId: "2", task: { project: { projectId: "111" }, total: '5' } }, { empId: "2", task: { project: { projectId: "333" }, total: '1' } }, { empId: "3", task: { project: { projectId: "111" }, total: '2' } }, { empId: "3", task: { project: { projectId: "111" }, total: '1' } }, { empId: "1", task: { project: { projectId: "222" }, total: '5' } }, { empId: "1", task: { project: { projectId: "111" }, total: '1' } } ];
预期输出
const newArr = [ // empId(1) + projectId(111) 组总工时 2+1=3 <4,保留所有任务 { empId: "1", task: { project: { projectId: "111" }, total: '2' } }, { empId: "1", task: { project: { projectId: "111" }, total: '1' } }, // empId(2) + projectId(333) 唯一任务,工时1<4,保留 { empId: "2", task: { project: { projectId: "333" }, total: '1' } }, // empId(3) + projectId(111) 组总工时 2+1=3 <4,保留所有任务 { empId: "3", task: { project: { projectId: "111" }, total: '2' } }, { empId: "3", task: { project: { projectId: "111" }, total: '1' } } ];
解决方案(JavaScript)
// 1. 按 empId-projectId 组合分组 const grouped = nonallocated.reduce((acc, taskItem) => { const key = `${taskItem.empId}-${taskItem.task.project.projectId}`; if (!acc[key]) { acc[key] = []; } acc[key].push(taskItem); return acc; }, {}); // 2. 筛选符合条件的任务组并扁平化结果 const newArr = Object.values(grouped).flatMap(group => { const totalHours = group.reduce((sum, item) => sum + Number(item.task.total), 0); return totalHours < 4 ? group : []; }); console.log(newArr);
代码解释
- 分组阶段:用
reduce方法将任务按empId和projectId的组合字符串作为键,把同组任务存入对应数组 - 筛选阶段:遍历每个分组,计算组内总工时(将
total字符串转为数字求和),若总工时小于4则保留该组所有任务,否则过滤 - 扁平化结果:通过
flatMap直接将符合条件的分组数组展开为最终的任务数组,无需额外处理嵌套结构
内容的提问来源于stack exchange,提问作者user20042604
相关产品推荐
相关产品推荐

