Как найти нужный элемент внутри вложенного элемента массива?

У меня есть такая структура в коде, которая является идентифицируемой и имеет вложенные элементы:

struct Item: Identifiable {
    
    let id: UUID = UUID()
    var nameOfItem: String
    var nestedItems: [Item]
    
    init(nameOfItem: String, nestedItems: [Item]) {
        self.nameOfItem = nameOfItem
        self.nestedItems = nestedItems
    }

}

var myArray: [Item] = [Item]()

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


2
68
1

Ответ:

Решено

Для ... update an item I know the id of that Item but I do not know how to look for that id and find it in correct way используйте рекурсию, например:

 func findItem(withID id: UUID, in items: [Item]) -> Item? {
     for item in items {
         if item.id == id {
             return item
         }
         if let foundItem = findItem(withID: id, in: item.nestedItems) {
             return foundItem
         }
     }
     return nil
 }

 

РЕДАКТИРОВАТЬ-1:

Вы можете использовать тот же подход (рекурсию) для создания словаря [UUID: Item] один раз. После этого вы можете напрямую получить доступ/обновить желаемый идентификатор элемента, без каких-либо дополнительных затрат на доступ.

var itemDictionary = createItemDictionary(items: myArray)
 
 itemDictionary[item2.id]?.nameOfItem = "Mickey Mouse"  // <--- here
 
 func createItemDictionary(items: [Item]) -> [UUID: Item] {
     var itemDictionary: [UUID: Item] = [:]
     for item in items {
         itemDictionary[item.id] = item
         itemDictionary.merge(createItemDictionary(items: item.nestedItems)) { (_, new) in new }
     }
     return itemDictionary
 }