Объединение двух массивов в один по ключу

#swift

#swift

Вопрос:

У меня есть два массива. Я хочу использовать их, чтобы создать новый. Затем новый список будет использоваться в представлении списка. Итак, как это выглядит? У меня есть две модели, которые являются основой для списков:

Фото:

 class Photo: Object, Identifiable, Decodable {
@objc dynamic var albumId: Int = 0
@objc dynamic var id: Int = 0
@objc dynamic var title: String = ""
@objc dynamic var url: String = ""
@objc dynamic var thumbnailUrl: String = ""

override static func primaryKey() -> String? {
    return "id"
}
}
  

Альбом:

 class Album: Object, Decodable {
@objc dynamic var id: Int = 0
@objc dynamic var userId: Int = 0
@objc dynamic var title: String = ""

override static func primaryKey() -> String? {
    return "id"
}

}
  

Дочерним элементом обоих является ListItem . Таким образом, переменные списков элементов используют переменные из классов Photo и Album . Надеюсь, я хорошо это объяснил. Если нет, пожалуйста, спросите.

 class ListItem {
var id: Int = 0                Album id
var title: String = ""         Photo title
var albumTitle: String = ""    Album title
var thumbnailUrl: String = ""  Photo thumbnailUrl

}
  

Ответ №1:

Вы можете использовать zip для объединения 2 массивов вместе, а затем вызвать map для создания ListItem s из каждого элемента.

 let list = zip(photos, albums).map { photo, album in ListItem(id: album.id, title: photo.title, albumTitle: album.title, thumbnailUrl: photo.thumbnailUrl)}
  

Ответ №2:

Если я правильно понял ваш вопрос, у вас есть отношение «один ко многим» между альбомом и фотографией, поэтому для каждой фотографии мы должны искать правильный альбом и создавать новый список

Это можно сделать с помощью этого кода

 let list: [ListItem] = photoArray.compactMap { photo in
    guard let album = albumArray.first(where: { $0.id == photo.id }) else {
        return nil
    }

    return ListItem(id: album.id, title: photo.title, albumTitle: album.title, thumbnailUrl: photo.url)
}