如何从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
相关产品推荐
相关产品推荐

