如何根据结构体子数组的条件过滤包含结构体的数组?
按子数组
heatlane条件过滤arrayEV数组的方案 首先先把你的结构体按Swift规范调整一下(类型名首字母大写、变量名小驼峰,方便后续代码阅读和维护):
struct HeatLane { var heat: Int var lane: Int var age: Int var swimmer: String var team: String var seed: Any? // 你提到的seed相关字段,这里用占位符适配 } struct Event { var eventNumber: Int var eventName: String var swimmers: [HeatLane]? } // 你的目标数组 var arrayEV: [Event] = []
接下来分两种常见场景给出具体过滤方案:
场景1:保留至少有一个HeatLane满足条件的Event
比如你想筛选出包含年龄≥18的游泳者、或某特定泳道(heat=2且lane=4)有选手的赛事,都可以用这个逻辑:
// 示例:筛选出swimmers中存在年龄≥18的游泳者的赛事 let filteredEvents = arrayEV.filter { event in // 先处理swimmers为nil的情况:如果赛事没有游泳者数据,这里选择不保留,可根据需求调整返回值 guard let swimmers = event.swimmers else { return false } // 替换成你的具体过滤条件即可 return swimmers.contains { heatLane in heatLane.age >= 18 // 其他示例条件:heatLane.heat == 2 && heatLane.lane == 4 // 或者 heatLane.team == "Ocean Swim Club" } }
逻辑说明
filter遍历顶层的arrayEV数组,对每个Event判断是否保留;- 通过
guard处理swimmers为可选值的情况,避免空指针问题; contains检查子数组swimmers中是否存在至少一个符合条件的HeatLane,如果存在则当前Event被保留。
场景2:保留所有HeatLane都满足条件的Event
如果你需要筛选出某个赛事里的所有游泳者都符合条件(比如所有选手年龄都≤12),可以用allSatisfy替代contains:
// 示例:筛选出swimmers中所有游泳者年龄都≤12的赛事 let filteredEventsAllMatch = arrayEV.filter { event in guard let swimmers = event.swimmers else { return false // nil的情况可根据需求调整返回值,比如需要保留则改为return true } return swimmers.allSatisfy { heatLane in heatLane.age <= 12 } }
自定义条件的灵活调整
你可以根据实际需求修改闭包里的判断逻辑,比如组合多个条件:
// 示例:筛选出有来自"Sunny Team"且年龄在14-16之间的游泳者的赛事 let customFiltered = arrayEV.filter { event in guard let swimmers = event.swimmers else { return false } return swimmers.contains { $0.team == "Sunny Team" && $0.age >= 14 && $0.age <= 16 } }
内容的提问来源于stack exchange,提问作者MW_DEVEL
相关产品推荐
相关产品推荐

