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

如何根据结构体子数组的条件过滤包含结构体的数组?

按子数组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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:14:26