如何扩展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) }
逻辑说明
- 基础过滤:先执行你原本的条件,把不符合区域、城市、国籍、人员数量为0、日期过期的记录全部排除,缩小处理范围。
- 日期有效性校验:通过分组和集合判断,找出那些在同一天内既有"day"又有"night"班次的日期。用
Set可以高效判断两种班次类型是否同时存在。 - 最终筛选:从基础过滤的结果里,只保留属于有效日期的记录,就得到了你想要的结果。
对应示例验证
在你提供的示例中:
- 基础过滤后,会排除
id=50(城市不符)和id=4(日期过期或国籍不符)的记录,剩下id=70和id=74。 - 分组后,
2018-06-06对应的班次类型集合是["day", "night"],符合有效日期的条件。 - 最终筛选后就保留了这两条记录,和你的期望结果一致。
内容的提问来源于stack exchange,提问作者mrs.bassim
相关产品推荐
相关产品推荐

