首页 > 解决方案 > 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 您如何从本质上根据其中的结构数组过滤数组?

标签: arraysswiftstructfiltersearchbar

解决方案


与您的问题无关,但您可以使用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"}]

推荐阅读