Есть ли способ отображать данные на нескольких уровнях Swift Map? - PullRequest
0 голосов
/ 05 августа 2020

Мне интересно, есть ли способ получить данные на нескольких уровнях объекта JSON, который я сопоставил в моделях?

Где $0.product, есть также массив назван [Promotions]. Итак, в идеале я хотел бы иметь возможность вытащить в $0.promotion, а также $0.product и вставить их в один и тот же объект (testData).

 self.holdTestData = testArray
    .compactMap { $0.search }
    .compactMap { $0.data }
    .flatMap { $0.results }
    .compactMap { $0.productItems }
    .compactMap { $0.product }
    .map {
        testData(
            name: $0.title,
            id: $0.id,
            weight: nil,
            Logo: "logo",
            price: nil,
            doublePrice: $0.price,
            imageURL: $0.defaultImageURL,
            barcode: ""
        )
    }

Имена выше являются t фактические имена моих объектов в проекте только потому, что проект является частным. Я постараюсь изо всех сил показать вам, что происходит от testArray: -

  var testArray: [TestSearch]?

struct TestSearch: Codable {
    let search: Search
}


struct Search: Codable {
    let data: DataClass
}

struct DataClass: Codable {
    let query: String
    let results: Results
 
}

struct Results: Codable {
    let productItems: [ProductItem]
}

struct ProductItem: Codable {
    let promotions: [Promotion]
    let product: TestProduct
}

struct Promotion: Codable {
    let promotionID, promotionType, startDate, endDate: String
    let offerText: String

    enum CodingKeys: String, CodingKey {
        case promotionID = "promotionId"
        case promotionType, startDate, endDate, offerText
    }
}

Сообщите мне, если вам также нужно, чтобы я включил структуру продукта

РЕШЕНИЕ:

Мне нужно было go подняться на уровень, а затем оттуда составить карту: -


self.holdTestData = testArray.compactMap{
                                           $0.search
                                       }.compactMap{
                                           $0.data
                                       }.compactMap{
                                           $0.results
                                       }.flatMap{
                                           $0.productItems
                                       }.compactMap{
                                        testData(name: $0.product.title, id: $0.product.id, weight: nil, Logo: "logo", price: nil, doublePrice: $0.product.price, imageURL: $0.product.defaultImageURL, barcode: "", offerText: $0.promotions.isEmpty ? "" : $0.promotions[0].offerText)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...