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

基于值合并Angular 5中的对象技术咨询

解决Angular 5.1中调度应用的时段对比问题

嘿,我来帮你搞定这个问题!首先得明确,你之前用Object.assign结合过滤器没生效,是因为这个场景不是简单的对象属性合并,而是需要对数组类型的时段集合做分组、聚合和差集计算。下面我一步步给你拆解实现思路和代码:

第一步:先明确数据结构假设

首先我先假设你的数据大概是这样的(如果实际结构有出入,你可以对应调整):

// 用户数据结构
interface User {
  id: number;
  name: string;
  // 其他用户属性,比如部门、联系方式等
}

// 可用时段:每条记录关联用户ID和时段编码
interface Availability {
  userId: number;
  timeCode: number; // 比如100=周日午夜,101=周日凌晨1点,以此类推
}

// 已调度时段:同样关联用户ID和时段编码
interface ScheduledShift {
  userId: number;
  timeCode: number;
}

第二步:按用户ID分组时段数据

我们需要先把可用时段和已调度时段分别按用户ID分组,这样每个用户对应的时段集合能快速获取:

// 辅助函数:把时段数据按用户ID分组,返回{用户ID: 时段编码数组}的映射
private groupTimeCodesByUser(data: {userId: number, timeCode: number}[]): Map<number, number[]> {
  return data.reduce((groupMap, item) => {
    // 先获取当前用户已有的时段集合,没有就新建空数组
    const existingCodes = groupMap.get(item.userId) || [];
    // 去重(避免同一个用户同一个时段重复录入)
    if (!existingCodes.includes(item.timeCode)) {
      existingCodes.push(item.timeCode);
    }
    groupMap.set(item.userId, existingCodes);
    return groupMap;
  }, new Map<number, number[]>());
}

第三步:合并用户数据并计算可用未调度时段

接下来我们遍历每个用户,把他们的可用时段、已调度时段整合,然后计算出可用但未被调度的时段,最后筛选出符合条件的用户:

// 假设你已经从服务/数据库获取到了以下数据
users: User[];
userAvailabilities: Availability[];
userScheduledShifts: ScheduledShift[];

// 核心方法:获取有可用未调度时段的用户
getQualifiedUsers() {
  // 先分组可用和已调度时段
  const availGroup = this.groupTimeCodesByUser(this.userAvailabilities);
  const scheduledGroup = this.groupTimeCodesByUser(this.userScheduledShifts);

  // 遍历用户,整合数据并计算差集
  const userWithShiftData = this.users.map(user => {
    // 获取当前用户的可用时段和已调度时段,没有则为空数组
    const userAvail = availGroup.get(user.id) || [];
    const userScheduled = scheduledGroup.get(user.id) || [];

    // 计算差集:可用但未被调度的时段
    const availableUnassigned = userAvail.filter(timeCode => !userScheduled.includes(timeCode));

    // 返回整合后的用户对象
    return {
      ...user,
      availableTimeCodes: userAvail,
      scheduledTimeCodes: userScheduled,
      availableUnassignedTimeCodes: availableUnassigned
    };
  });

  // 筛选出至少有一个可用未调度时段的用户
  return userWithShiftData.filter(user => user.availableUnassignedTimeCodes.length > 0);
}

为什么之前的方法失效?

你提到用Object.assign结合过滤器没用,是因为Object.assign的作用是合并对象的属性键值对,比如把对象A的属性复制到对象B里,但你这里的需求是处理数组层面的集合对比:需要把每个用户对应的两组数组(可用/已调度)做差集计算,这完全不是Object.assign能处理的场景,所以才会失效。

如果你需要在模板里展示结果,直接在组件里调用getQualifiedUsers(),然后用*ngFor遍历即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:52:01