在结构中过滤struct数组
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在结构中过滤struct数组相关的知识,希望对你有一定的参考价值。
假设您有一系列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())
}
如何过滤所有者属性?
答案
使用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)})})
另一答案
你需要
let filteredCars = cars.filter {
return $0.model.lowercased().contains(textToSearch.lowercased()) ||
!$0.owners.filter { $0.name.lowercased().contains(textToSearch.lowercased())}.isEmpty
}
另一答案
首先,每次迭代转换为小写的两次转换效率不高。
更好地使用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
}
以上是关于在结构中过滤struct数组的主要内容,如果未能解决你的问题,请参考以下文章
在 Bigquery 中,如何使用标准 Sql 过滤 Struct 数组以匹配 Struct 中的多个字段?