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

如何扩展Swift对象数组过滤逻辑,保留同一日期含day/night班次的记录

解决方案

要实现这个需求,我们可以分三步完成:先执行你原本的过滤逻辑得到初步结果,再筛选出同时包含"day"和"night"班次的日期,最后只保留这些日期对应的记录。以下是具体的Swift代码实现:

// 1. 执行原有的基础过滤逻辑
let todaydate = Date() // 确保已正确初始化当前日期
var filtered_shifts = myShifts.filter {
    $0.regionName == region && 
    $0.cityName == city && 
    $0.idNationality == idn && 
    $0.quantityStaff != 0 && 
    $0.shiftDate > todaydate
}

// 2. 找出同时包含"day"和"night"班次的有效日期
// 按shiftDate分组,收集每个日期下的所有班次类型集合
let dateShiftTypeMap = Dictionary(grouping: filtered_shifts) { $0.shiftDate }
    .mapValues { shifts in Set(shifts.map { $0.shiftType }) }

// 筛选出同时包含两种班次类型的日期
let validShiftDates = dateShiftTypeMap.filter { shiftTypes in
    shiftTypes.value.contains("day") && shiftTypes.value.contains("night")
}.map { $0.key }

// 3. 最终过滤:只保留有效日期对应的班次记录
filtered_shifts = filtered_shifts.filter { validShiftDates.contains($0.shiftDate) }

逻辑说明

  1. 基础过滤:先执行你原本的条件,把不符合区域、城市、国籍、人员数量为0、日期过期的记录全部排除,缩小处理范围。
  2. 日期有效性校验:通过分组和集合判断,找出那些在同一天内既有"day"又有"night"班次的日期。用Set可以高效判断两种班次类型是否同时存在。
  3. 最终筛选:从基础过滤的结果里,只保留属于有效日期的记录,就得到了你想要的结果。

对应示例验证

在你提供的示例中:

  • 基础过滤后,会排除id=50(城市不符)和id=4(日期过期或国籍不符)的记录,剩下id=70和id=74。
  • 分组后,2018-06-06对应的班次类型集合是["day", "night"],符合有效日期的条件。
  • 最终筛选后就保留了这两条记录,和你的期望结果一致。

内容的提问来源于stack exchange,提问作者mrs.bassim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:24:18