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

Swift中如何通过ID对比两个结构体数组并筛选目标数组?

解决Swift数组筛选问题:基于ID匹配合并两个结构体数组

我来帮你搞定这个筛选问题~先看看你原来代码的问题:你把筛选的对象搞反了,而且闭包里的$0参数冲突了,导致逻辑出错。你的目标是把twoData中ID在oneData里存在的元素筛选到mainArray,那我们来一步步实现正确的方案:

高效实现方案(推荐)

首先,我们可以把oneData里的所有ID提取到一个Set中,这样后续的ID查找操作是O(1)的时间复杂度,效率很高,尤其是当数组元素较多的时候:

// 提取oneData中所有ID到Set
let oneIDSet = Set(oneData.map { $0.ID })

// 筛选twoData中ID存在于oneIDSet的元素
mainArray = twoData.filter { oneIDSet.contains($0.ID) }

运行这段代码后,mainArray里会包含twoData中ID为"1"、"2"、"3"的元素,正好匹配oneData里的ID集合。

另一种实现(适合小数据量)

如果你的数组元素不多,也可以直接在filter里嵌套contains检查,不过要注意明确命名闭包参数,避免$0的冲突:

mainArray = twoData.filter { twoItem in
    // 检查oneData中是否有元素的ID和当前twoItem的ID一致
    oneData.contains { $0.ID == twoItem.ID }
}

为什么你的原代码报错?

你原来的代码mainArray = oneData.filter{ $0.ID == twoData.contains(where: $0.ID)}有三个核心问题:

  1. 筛选对象错误:你对oneData做了filter,但你的目标是填充twoData里的元素到mainArray,方向完全搞反了。
  2. 参数冲突:闭包里的$0同时指代oneData的元素和twoData.contains闭包的参数,编译器无法识别,直接导致语法错误。
  3. 逻辑错误:twoData.contains(where:)需要一个闭包条件,而你直接传了$0.ID,这不符合方法的参数要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:58:34