在结构中过滤结构数组

时间:2019-04-14 13:33:34

标签: swift

假设您有一系列的汽车结构,其中包含了一系列以前的所有者。

struct Car {
   var model: String // Ford Taurus
   var owners: [Owner]
}

struct Owner {
   var name: String // Harrison Ford
   var location: String // Oxford
}

当人们搜索“福特”时,我想检查“ Car”车型以及“ ford”一词的所有者名称和位置。我知道如何过滤Car模型,但不过滤Owner属性。

let filteredCars = cars.filter { (car) -> Bool in
            return car.model.lowercased().contains(textToSearch.lowercased())
        }

如何也过滤所有者属性?

3 个答案:

答案 0 :(得分:2)

使用or进行双重过滤,对于所有者,我在搜索之前先加入了这两个属性,因为哪个属性匹配都没有关系

let searchKey = "Ford".lowercased()
let selected = cars.filter({
    $0.model.lowercased().contains(searchKey) ||
    $0.owners.contains(where: {"\($0.name) ($0.location)".lowercased().contains(searchKey)})})

答案 1 :(得分:1)

您需要

let filteredCars = cars.filter {
    return $0.model.lowercased().contains(textToSearch.lowercased()) ||
           !$0.owners.filter { $0.name.lowercased().contains(textToSearch.lowercased())}.isEmpty

}

答案 2 :(得分:1)

首先,两次转换为小写都不太有效。

最好将range(of与选项.caseInsensitive一起使用。

let filteredCars = cars.filter { (car) -> Bool in
    return car.model.range(of: textToSearch, options: .caseInsensitive) != nil ||
    !car.owners.filter({"\($0.name) \($0.location)".range(of: textToSearch, options: .caseInsensitive) != nil}).isEmpty
}
相关问题