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 — это искомое значение.

Как я могу фильтровать MyArrayOfPaintings на основе предоставленного PaintColourName, как вы по существу фильтруете массив на основе массива структур внутри него?

Таким же образом. Вам просто нужно спросить у каждой картины, имеет ли какая-либо из используемых красок этот цвет.

matt 21.12.2020 01:29

Также, пожалуйста, начинайте имена свойств и имена переменных с минускула. Заглавные буквы для типов.

matt 21.12.2020 01:36
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
2
92
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не имеет отношения к вашему вопросу, но вы можете использовать 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"}]

Спасибо, это помогло, также не понял, что функция нечувствительности к регистру помогает сохранить еще одну строку преобразований. Спасибо

Scott 21.12.2020 14:26

Другие вопросы по теме