Найти ключ в словаре на основании дочернего элемента из массива

swift

#1

Всем привет! :slight_smile:

Есть три объекта - “Категория”, “Подкатегория” и “Продукт”. Категорий может быть n кол-во. У любой категории может быть n кол-во подкатегорий. Подкатегорий может быть n кол-во. У подкатегории, также, продуктов может быть n.

У Категории, подкатегории, и у продукта есть code и name

Получаются такие структуры -

struct ObjInfo: Codable {
var code: String?
var name: String?
}

struct UniversalModel: Codable {
var info = ObjInfo()
var products: [UniversalModel]?
var subCategory[UniversalModel]?
}

Я создал словарь [ObjInfo : [UniversalModel]], где - ключ является родительским элементом, а значение массивом дочерних элементов. Ну то есть, к примеру, у нас словарь подкатегорий:

  1. Ключ является информацией о категории, к которой принадлежит массив подкатегорий
  2. Значение является массивом подкатегорий, который принадлежит определенной категории.

Необходимо написать метод для поиска подкатегории, чтобы я смог найти информацию о родителе (родительская категория).

Допустим, у меня есть некий code объект подкатегории. Я его вношу в метод и получаю информацию о родителе (категория). Сейчас есть метод, но мне кажется, что его можно как-то улучшить. Снизить сложность алгоритма. На данный момент, сложность алгоритма O((n+m)^2)

Вот метод -

 func findParentObject(code: String?, searchDict: [ObjInfo : [UniversalModel]]) -> ObjInfo? {
    var findedObj: ObjInfo?        
    
    for element in searchDict {
        for parent in element.value {
            if parent.info.code == code {
                findedObj = element.key
                break
            }
        }
    }

    return findedObj
}

Можно-ли как-то упростить данный алгоритм?


#2

В плане сложности не уверен, но можно сделать запись короче

var findedObj = searchDict.first(where: {
    $0.value.first(where: {
        $0.info.code == code
    }) != nil
})?.key