【问题标题】:How can I filter by an array which is contained as a value of a struct如何按包含为结构值的数组进行过滤
【发布时间】:2018-05-08 13:18:00
【问题描述】:
下面是我存储在一个名为 arrayEV 的数组中的数据结构
我很确定我可以按顶部数组中的事件名称进行过滤。
但是我不确定如何通过子数组 [heatlane] 中的内容过滤数组,所以我只希望在 [heatlane] 中的内容满足条件时显示主 arrayEV
struct events {
var eventnumber:Int
var eventname:String
var swimmers:[heatlane]?
}
struct heatlane{
var heat:Int
var lane:Int
var age:Int
var swimmer:String
var team:String
var seedTime:String
var finalsTime:String
}
【问题讨论】:
标签:
arrays
swift
dictionary
multidimensional-array
【解决方案1】:
通过简单属性(如Int)或更复杂的属性(如Array 或其他)进行过滤的方法没有区别。您应该只传递应该过滤哪些元素的条件。
如果您想过滤事件并且只有这些事件的名称以“A”开头,您可以这样写:
let prefixedWithA = events.filter{ $0.eventname.hasPrefix("A") }
如果您想过滤名称以“A”为前缀的游泳者的事件,您可以这样写:
let hasSwimmerPrefixedWithA = events.filter{ $0.swimmers?.contains(where: {$0.swimmer.hasPrefix("A")}) ?? false }
【解决方案2】:
使用Array.filter ..
var array: [Any] = []
var heatlaneArr: [heatlane] = []
array.append(heatlaneArr)
像这样过滤数组,检查数组的每个数组元素
let findHeatlaneArray = array.filter { (obj) -> Bool in
return ((obj as? [heatlane]) != nil)
}
【解决方案3】:
let resultFilter = arrayEV.filter { (events) -> Bool in
guard let swimmers = events.swimmers else { return false } // check swimmers not nil
let result = swimmers.filter({ $0.age == 1}) // age condition
return result.count == 0 ? false : true
}