arrays - Swift如何过滤数组中的数组
问题描述
我有一个数组定义为:
var MyArrayOfPaintings = [Painting]()
其中绘画被定义为:
struct Painting{
let Artist: String
let Name: String
let ThumbNailURL: String
var PaintsUsed: [Paint]
}
和 Paint 定义为:
struct Paint{
var PaintType: String
var PaintColorName: String
}
通常,如果我想根据搜索栏中的 Name 属性过滤此数组,我只需添加一行:
FilteredArray = MyArrayOfPaintings.filter({$0.Name.lowercased().contains(searchText.lowercased())})
这很好用,但现在在我的搜索栏中,我还希望能够搜索然后过滤 MyArray,其中 PaintColorName 是搜索的值。
如何根据提供的 PaintColourName 过滤 MyArrayOfPaintings 您如何从本质上根据其中的结构数组过滤数组?
解决方案
与您的问题无关,但您可以使用localizedCaseInsensitiveContains 而不是小写名称和搜索文本。关于您的问题,您可以过滤包含颜色名称的颜料。
struct Painting {
let artist: String
let name: String
let thumbNailURL: String
var paints: [Paint]
}
struct Paint {
var type: String
var colorName: String
}
var paintings: [Painting] = [.init(artist: "Artist A", name: "Name A", thumbNailURL: "url1", paints: [.init(type: "a", colorName: "white"), .init(type: "b", colorName: "black")]),
.init(artist: "Artist B", name: "Name B", thumbNailURL: "url2", paints: [.init(type: "c", colorName: "red"), .init(type: "d", colorName: "green")])]
let searchText = "green"
let filtered = paintings.filter { $0.paints.contains {$0.colorName.localizedCaseInsensitiveContains(searchText) } }
print(filtered) // [Painting(artist: "Artist B", name: "Name B", thumbNailURL: "url2", paints: [Paint(type: "c", colorName: "red"), Paint(type: "d", colorName: "green")])]
如果您只想获得绘画,您可以使用 flatMap 代替过滤器,然后使用过滤器代替包含:
let paints = paintings.flatMap { $0.paints.filter {$0.colorName.localizedCaseInsensitiveContains(searchText) } }
paints // [{type "d", colorName "green"}]
推荐阅读
- google-bigquery - Bigquery:将来自多个where子句的数据组合为一个sql查询中的一个字符串
- c# - 在刻度上映射数字
- azure - 如何在 azure signalr 功能中启用组选项?
- android - 在 Android 中使用分页时如何启用占位符?
- kotlin - 启动协程的单一方法
- java - 用列表的随机变量替换 %s
- c# - Visual Studio c# 项目参考(使用)不起作用
- ios - 如何在 iOS 13 中使用“requestAlwaysAuthorization”在 CLLocationManager 中请求地理位置?
- powershell - 如何使用 PowerShell 从物理磁盘中过滤一些信息?
- ios - AVPlayer 从 url 加载缓慢