Применить фильтр в словаре массива объектов

#ios #arrays #swift #dictionary #filter

#iOS #массивы #swift #словарь #Фильтр

Вопрос:

У меня есть класс свойств с именем «EpisodeInfoData»

 class EpisodeInfoData {
    var episodeId = ""
    var episodeName = ""
}
  

Я храню объекты этого класса в словаре, первым элементом которого является «Строка», а другим элементом является массив объектов класса «EpisodeInfoData»

 var episodes    = Dictionary<String, [EpisodeInfoData]>()

let infoObj1 = EpisodeInfoData()
infoObj1.episodeId           = "1"
infoObj1.episodeName         = "one"

let infoObj2 = EpisodeInfoData()
infoObj2.episodeId           = "2"
infoObj2.episodeName         = "two"

let infoObj3 = EpisodeInfoData()
infoObj3.episodeId           = "3"
infoObj3.episodeName         = "three"

let infoObj4 = EpisodeInfoData()
infoObj4.episodeId           = "4"
infoObj4.episodeName         = "four"

let infoObj5 = EpisodeInfoData()
infoObj5.episodeId           = "5"
infoObj5.episodeName         = "five"

let infoObj6 = EpisodeInfoData()
infoObj6.episodeId           = "6"
infoObj6.episodeName         = "six"

let infoObj7 = EpisodeInfoData()
infoObj7.episodeId           = "7"
infoObj7.episodeName         = "seven"

let infoObj8 = EpisodeInfoData()
infoObj8.episodeId           = "8"
infoObj8.episodeName         = "eight"

episodes["season1"] = [infoObj1,infoObj2,infoObj3,infoObj4]
episodes["season2"] = [infoObj5,infoObj6,infoObj7,infoObj8]
  

Я хочу получить название сезона в словаре «эпизоды», чье имя эпизода равно «восемь». Я попытался применить к нему фильтр, но он не работал.

Может ли кто-нибудь предложить мне что-нибудь, чтобы найти результат с помощью фильтров без использования фильтров.

Заранее благодарю вас

Комментарии:

1. если у меня есть название «сезона», то он работает «пусть temp = эпизоды [«season1»]!.filter { $ 0.episodeId == «8» }» но если у меня есть только идентификатор эпизода, тогда я попробовал это «пусть temp = эпизоды. filter { $ 0.1.filter { $ 0.episodeId == «8»} }»

2. Эй, Авинаш, добро пожаловать в Stack Overflow. Я внес некоторые улучшения в ваш код, и я показываю, что я их сделал, шаг за шагом. Проверьте это здесь .

3. Александр спасибо за улучшения. Я действительно ценю ваши усилия.

Ответ №1:

пришлось добавить еще один ответ благодаря тем, кто голосует без особой помощи.

попробуйте это

 if let episode = (episodes.filter { $0.1.contains { $0.episodeName == "eight" } }).first {
    print(episode.0) // season2
}
  

Комментарии:

1. Большое вам спасибо, коропок. это похоже на спасительное решение.

Ответ №2:

Вот рабочее решение.

 struct EpisodeInfoData {
    let episodeId: String
    let episodeName: String
}

let episodes = [
    "season1": [
        EpisodeInfoData(
            episodeId: "1",
            episodeName: "one"
        ),
        EpisodeInfoData(
            episodeId: "2",
            episodeName: "two"
        ),
        EpisodeInfoData(
            episodeId: "3",
            episodeName: "three"
        ),
        EpisodeInfoData(
            episodeId: "4",
            episodeName: "four"
        ),
    ],

    "season2": [
        EpisodeInfoData(
            episodeId: "5",
            episodeName: "five"
        ),
        EpisodeInfoData(
            episodeId: "6",
            episodeName: "six"
        ),
        EpisodeInfoData(
            episodeId: "7",
            episodeName: "seven"
        ),
        EpisodeInfoData(
            episodeId: "8",
            episodeName: "eight"
        )
    ]
]

let desiredName = "eight"

let result = episodes.filter{ _, seasonEpisodes in
    return seasonEpisodes.contains{ $0.episodeName == desiredName }
}.map{ key, value in return key}

print(result)
  

Сначала фильтруется словарь эпизодов. Пары ключ-значение в словаре сохраняются только в том случае, если значение ( seasonEpisodes массив) содержит эпизод с desiredName . Затем эти пары ключ-значение сопоставляются, и возвращаются только ключи (названия сезонов).