在结构中过滤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数组的主要内容,如果未能解决你的问题,请参考以下文章

通过特定映射过滤 2 个结构/数组

在 Bigquery 中,如何使用标准 Sql 过滤 Struct 数组以匹配 Struct 中的多个字段?

为什么我不能在此片段中生成唯一对象数组?

struct 内部的 malloc 结构数组

c#node struct自定义LinkedListNode结构中的循环依赖

flexible array柔性数组不定长的数据结构Struct详解