You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按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);

代码解释

  1. 分组阶段:用reduce方法将任务按empId和projectId的组合字符串作为键,把同组任务存入对应数组
  2. 筛选阶段:遍历每个分组,计算组内总工时(将total字符串转为数字求和),若总工时小于4则保留该组所有任务,否则过滤
  3. 扁平化结果:通过flatMap直接将符合条件的分组数组展开为最终的任务数组,无需额外处理嵌套结构

内容的提问来源于stack exchange,提问作者user20042604

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 00:55:15