在结构中过滤struct数组

问题描述 投票:0回答:3

假设您有一系列Car structs,其中包含了一系列以前的所有者。

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

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

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

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

如何过滤所有者属性?

swift
3个回答
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
投票

你需要

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

}

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
}
© www.soinside.com 2019 - 2024. All rights reserved.