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

如何从Swift的String数组和自定义Struct数组中提取匹配serialNo的公共值

实现方案

你当前用filter得到的是ScanData类型的对象数组,只需要额外做一次映射提取serialNo字段,再对localArray做分类即可,完整可运行代码如下:

struct ScanData{
    var serialNo : String!
    var intNo : String!
    init(serialNo : String, intNo : String) {
        self.serialNo = serialNo
        self.intNo = intNo
    }
}
var validScannedData : [String] = []
var inValidScannedData : [String] = []
var arrayObj = [ScanData(serialNo: "12220116033", intNo: "SN6AT4.270"),ScanData(serialNo: "12198144025", intNo: "SN6AT4.280"),ScanData(serialNo: "12222383027", intNo: "SN6AT4.130"),ScanData(serialNo: "12198213032", intNo: "SN6AT5.260"),ScanData(serialNo: "", intNo: "")]
var localArray = ["12220116033","12198144025","12222383027","12198213032","12199690049"]
let tempArray = arrayObj.filter { data in
    return data.serialNo != "" || data.intNo != ""
}

// 核心逻辑代码
// 提取tempArray中所有的serialNo转成Set提高匹配效率
let serialSet = Set(tempArray.map(\.serialNo))
// 遍历localArray分类存入对应数组
for serial in localArray {
    if serialSet.contains(serial) {
        validScannedData.append(serial)
    } else {
        inValidScannedData.append(serial)
    }
}

// 输出结果
print("Valid data : \(validScannedData)")
print("Invalid data : \(inValidScannedData)")
输出结果
Valid data : ["12220116033", "12198144025", "12222383027", "12198213032"]
Invalid data : ["12199690049"]
逻辑说明
  • tempArray.map(\.serialNo) 操作会把[ScanData]类型的数组转换成[String]类型的序列号数组,解决你之前得到对象数组的问题
  • 转换为Set是为了降低匹配时的时间复杂度,数据量较小时直接用数组判断也可以正常运行
  • 遍历localArray逐个判断归属即可得到你需要的两个结果数组

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:54:08