Запустите цикл внутри вложенного массива в Swift

Я пытаюсь получить результат, используя цикл for внутри вложенного ответа, но не получаю требуемого результата. Я попробовал, но не получил желаемого ответа. Требуемый результат приведен ниже.


[
 [["P-1 Test one","P-1 Test Two","P-1 Test Three"]],
 [["P-2 Test One"","P-2 Test One"],["P-2 A-1 Test one","P-2 A-1 Test two","P-2 A-1 Test three","P-2 A-1 Test four"],["P-2 A-2 Test one","P-2 A-2 Test two","P-2 A-3 Test three","P-2 A-4 Test four"]],
 [["P-3 Test One"],["P-3 A-1 Test one","P-3 A-1 Test Two","P-3 A-1 Test three","P-3 A-1 Test four"]]
 ]

Я использую ответ json ниже, чтобы получить требуемый результат.

{
    "page_size": 20,
    "page": 1,
    "count": 209,
    "results": [
        {
            "_score": null,
            "plink_id": "plifnW",
        "customer_name": "Primary member one",
            "packages": [
                {
                    "is_addon": false,
                    "addon_price": 0,
                    "parameter": 1,
                    "name": "P-1 Test one",
                    "id": 54,
                    "package_city_prices": {
                        "package_price": 160,
                        "offer_price": 99
                    },
                    "slug_name": "Test-one-slug"
                },
                {
                    "is_addon": false,
                    "addon_price": 0,
                    "parameter": 1,
                    "name": "P-1 Test Two",
                    "id": 54,
                    "package_city_prices": {
                        "package_price": 160,
                        "offer_price": 99
                    },
                    "slug_name": "Test-Two-slug"
                },
                {
                    "is_addon": false,
                    "addon_price": 0,
                    "parameter": 1,
                    "name": "P-1 Test Three",
                    "id": 54,
                    "package_city_prices": {
                    "package_price": 160,
                    "offer_price": 99
                },
                    "slug_name": "Test-Two-slug"
                }
            ],
            "verification_remark": "Duplicate Booking",
            "additional_members": []
        },
        {
            "_score": null,
            "plink_id": "plifnW",
         "customer_name": "Primary member two",
            "packages": [
                {
                    "is_addon": false,
                    "addon_price": 0,
                    "parameter": 1,
                    "name": "P-2 Test One",
                    "id": 54,
                    "package_city_prices": {
                        "package_price": 160,
                        "offer_price": 99
                    },
                    "slug_name": "Test one slug"
                },
                {
                    "is_addon": false,
                    "addon_price": 0,
                    "parameter": 1,
                    "name": "P-2 Test One",
                    "id": 54,
                    "package_city_prices": {
                    "package_price": 160,
                    "offer_price": 99
                },
                    "slug_name": "Test one slug"
                }
            ],
            "verification_remark": "Duplicate Booking",
            "additional_members": [
                {
                    "plink_id": null,
                    "alloted_time": null,
                    "customer_name": "Additional member one",
                    "packages": [
                        {
                            "is_addon": false,
                            "tat_time": null,
                            "name": "P-2 A-1 Test one",
                            "slug_name": "Test_one_slug"
                        },
                        {
                            "is_addon": false,
                            "tat_time": null,
                            "name": "P-2 A-1 Test two",
                            "slug_name": "Test_Two_slug"
                        },
                        {
                            "is_addon": false,
                            "tat_time": null,
                            "name": "P-2 A-1 Test three",
                            "slug_name": "Test_Three_slug"
                        },
                        {
                            "is_addon": false,
                            "tat_time": null,
                            "name": "P-2 A-1 Test four",
                            "slug_name": "Test_four_slug"
                        }
                    ]
                },
                {
                    "plink_id": null,
                    "alloted_time": null,
                    "customer_name": "Additional member Two",
                    "packages": [
                        {
                            "is_addon": false,
                            "tat_time": null,
                            "name": "P-2 A-2 Test one",
                            "slug_name": "Test_one_slug"
                        },
                    {
                            "is_addon": false,
                            "tat_time": null,
                            "name": "P-2 A-2 Test two",
                            "slug_name": "Test_Two_slug"
                    },
                    {
                            "is_addon": false,
                            "tat_time": null,
                            "name": "P-2 A-3 Test three",
                            "slug_name": "Test_Three_slug"
                    },
                    {
                            "is_addon": false,
                            "tat_time": null,
                            "name": "P-2 A-4 Test four",
                            "slug_name": "Test_four_slug"
                        }
                    ]
                }
                ]
        },
          {
            "_score": null,
            "plink_id": "plifnW",
         "customer_name": "Primary member Three",
            "packages": [
                {
                    "is_addon": false,
                    "addon_price": 0,
                    "parameter": 1,
                    "name": "P-3 Test One",
                    "id": 54,
                    "package_city_prices": {
                        "package_price": 160,
                        "offer_price": 99
                    },
                    "slug_name": "test five slug"
                }
            ],
            "verification_remark": "Duplicate Booking",
            "additional_members": [
                {
                    "plink_id": null,
                    "alloted_time": null,
                    "customer_name": "P-3-A-1 additional member",
                    "packages": [
                        {
                            "is_addon": false,
                            "tat_time": null,
                            "name": "P-3 A-1 Test one",
                            "slug_name": "Test_one_slug"
                        },
                        {
                            "is_addon": false,
                            "tat_time": null,
                            "name": "P-3 A-1 Test Two",
                            "slug_name": "Test_Two_slug"
                        },
                        {
                            "is_addon": false,
                            "tat_time": null,
                            "name": "P-3 A-1 Test three",
                            "slug_name": "Test_Three_slug"
                        },
                        {
                            "is_addon": false,
                            "tat_time": null,
                            "name": "P-3 A-1 Test four",
                            "slug_name": "Test_four_slug"
                        }
                    ]
                }
            ]
        }
    ]
}

Здесь, в этом ответе, параметр «additional_mamber» может быть пустым или иметь несколько членов или тестов. Я использовал следующий код, чтобы получить результат.

for testResult in self.bookingArray?.results ?? [] {
    var testPackageArrayOne = [[String]]()
    for testPackage in testResult.packages ?? [] {
        testPackageArrayOne.append([testPackage.name ?? ""])
    }
    for member in testResult.additional_members ?? [] {
        var newAdditionArray = [String]()
        for additionalMemberTests in member.packages ?? [] {
            newAdditionArray.append(additionalMemberTests.name ?? "")
        }
        testPackageArrayOne.append(newAdditionArray)
    }
    print("testPackageArrayOne==>>",testPackageArrayOne)
    arrayOfTests.append(testPackageArrayOne)
    print("arrayOfTestArrays==>>",arrayOfTests)
}
// Print the resulting array of arrays
for array in arrayOfTests {
    print("individual array for every member ==>>",array)
}
print("member and additional members array ==>>",self.memberNameArray)
                

Но не получив желаемого результата.

Не уверен, почему ОП получает отрицательные голоса, а его пост получает голоса за закрытие. Мне кажется довольно ясным вопрос относительно ожидаемых результатов ОП.

Leo Dabus 18.06.2024 09:31
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
1
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не уверен, зачем вам нужен третий уровень вашего массива, но с использованием функционального программирования (map, FlatMap) все должно быть довольно просто:

let data = Data("""
{
    "page_size": 20,
    "page": 1,
    "count": 209,
    "results": [
        {
            "_score": null,
            "plink_id": "plifnW",
            "customer_name": "Primary member one",
            "packages": [
                {
                    "is_addon": false,
                    "addon_price": 0,
                    "parameter": 1,
                    "name": "P-1 Test one",
                    "id": 54,
                    "package_city_prices": {
                        "package_price": 160,
                        "offer_price": 99
                    },
                    "slug_name": "Test-one-slug"
                },
                {
                    "is_addon": false,
                    "addon_price": 0,
                    "parameter": 1,
                    "name": "P-1 Test Two",
                    "id": 54,
                    "package_city_prices": {
                        "package_price": 160,
                        "offer_price": 99
                    },
                    "slug_name": "Test-Two-slug"
                },
                {
                    "is_addon": false,
                    "addon_price": 0,
                    "parameter": 1,
                    "name": "P-1 Test Three",
                    "id": 54,
                    "package_city_prices": {
                        "package_price": 160,
                        "offer_price": 99
                    },
                    "slug_name": "Test-Two-slug"
                }
            ],
            "verification_remark": "Duplicate Booking",
            "additional_members": []
        },
        {
            "_score": null,
            "plink_id": "plifnW",
            "customer_name": "Primary member two",
            "packages": [
                {
                    "is_addon": false,
                    "addon_price": 0,
                    "parameter": 1,
                    "name": "P-2 Test One",
                    "id": 54,
                    "package_city_prices": {
                        "package_price": 160,
                        "offer_price": 99
                    },
                    "slug_name": "Test one slug"
                },
                {
                    "is_addon": false,
                    "addon_price": 0,
                    "parameter": 1,
                    "name": "P-2 Test One",
                    "id": 54,
                    "package_city_prices": {
                        "package_price": 160,
                        "offer_price": 99
                    },
                    "slug_name": "Test one slug"
                }
            ],
            "verification_remark": "Duplicate Booking",
            "additional_members": [
                {
                    "plink_id": null,
                    "alloted_time": null,
                    "customer_name": "Additional member one",
                    "packages": [
                        {
                            "is_addon": false,
                            "tat_time": null,
                            "name": "P-2 A-1 Test one",
                            "slug_name": "Test_one_slug"
                        },
                        {
                            "is_addon": false,
                            "tat_time": null,
                            "name": "P-2 A-1 Test two",
                            "slug_name": "Test_Two_slug"
                        },
                        {
                            "is_addon": false,
                            "tat_time": null,
                            "name": "P-2 A-1 Test three",
                            "slug_name": "Test_Three_slug"
                        },
                        {
                            "is_addon": false,
                            "tat_time": null,
                            "name": "P-2 A-1 Test four",
                            "slug_name": "Test_four_slug"
                        }
                    ]
                },
                {
                    "plink_id": null,
                    "alloted_time": null,
                    "customer_name": "Additional member Two",
                    "packages": [
                        {
                            "is_addon": false,
                            "tat_time": null,
                            "name": "P-2 A-2 Test one",
                            "slug_name": "Test_one_slug"
                        },
                        {
                            "is_addon": false,
                            "tat_time": null,
                            "name": "P-2 A-2 Test two",
                            "slug_name": "Test_Two_slug"
                        },
                        {
                            "is_addon": false,
                            "tat_time": null,
                            "name": "P-2 A-3 Test three",
                            "slug_name": "Test_Three_slug"
                        },
                        {
                            "is_addon": false,
                            "tat_time": null,
                            "name": "P-2 A-4 Test four",
                            "slug_name": "Test_four_slug"
                        }
                    ]
                }
            ]
        },
        {
            "_score": null,
            "plink_id": "plifnW",
            "customer_name": "Primary member Three",
            "packages": [
                {
                    "is_addon": false,
                    "addon_price": 0,
                    "parameter": 1,
                    "name": "P-3 Test One",
                    "id": 54,
                    "package_city_prices": {
                        "package_price": 160,
                        "offer_price": 99
                    },
                    "slug_name": "test five slug"
                }
            ],
            "verification_remark": "Duplicate Booking",
            "additional_members": [
                {
                    "plink_id": null,
                    "alloted_time": null,
                    "customer_name": "P-3-A-1 additional member",
                    "packages": [
                        {
                            "is_addon": false,
                            "tat_time": null,
                            "name": "P-3 A-1 Test one",
                            "slug_name": "Test_one_slug"
                        },
                        {
                            "is_addon": false,
                            "tat_time": null,
                            "name": "P-3 A-1 Test Two",
                            "slug_name": "Test_Two_slug"
                        },
                        {
                            "is_addon": false,
                            "tat_time": null,
                            "name": "P-3 A-1 Test three",
                            "slug_name": "Test_Three_slug"
                        },
                        {
                            "is_addon": false,
                            "tat_time": null,
                            "name": "P-3 A-1 Test four",
                            "slug_name": "Test_four_slug"
                        }
                    ]
                }
            ]
        }
    ]
}
""".utf8
)

// MARK: - Booking
struct Booking: Codable {
    let pageSize, page, count: Int
    let results: [Result]

    enum CodingKeys: String, CodingKey {
        case pageSize = "page_size"
        case page, count, results
    }
}

// MARK: - Result
struct Result: Codable {
//    let score: Int?
    let plinkID, customerName: String
    let packages: [ResultPackage]
    let verificationRemark: String
    let additionalMembers: [AdditionalMember]

    enum CodingKeys: String, CodingKey {
//        case score = "_score"
        case plinkID = "plink_id"
        case customerName = "customer_name"
        case packages
        case verificationRemark = "verification_remark"
        case additionalMembers = "additional_members"
    }
}

// MARK: - AdditionalMember
struct AdditionalMember: Codable {
//    let plinkID: String?
//    let allotedTime: Date?
    let customerName: String
    let packages: [AdditionalMemberPackage]

    enum CodingKeys: String, CodingKey {
//        case plinkID = "plink_id"
//        case allotedTime = "alloted_time"
        case customerName = "customer_name"
        case packages
    }
}

// MARK: - AdditionalMemberPackage
struct AdditionalMemberPackage: Codable {
    let isAddon: Bool
//    let tatTime: Date?
    let name, slugName: String

    enum CodingKeys: String, CodingKey {
        case isAddon = "is_addon"
//        case tatTime = "tat_time"
        case name
        case slugName = "slug_name"
    }
}

// MARK: - ResultPackage
struct ResultPackage: Codable {
    let isAddon: Bool
    let addonPrice, parameter: Int
    let name: String
    let id: Int
    let packageCityPrices: PackageCityPrices
    let slugName: String

    enum CodingKeys: String, CodingKey {
        case isAddon = "is_addon"
        case addonPrice = "addon_price"
        case parameter, name, id
        case packageCityPrices = "package_city_prices"
        case slugName = "slug_name"
    }
}

// MARK: - PackageCityPrices
struct PackageCityPrices: Codable {
    let packagePrice, offerPrice: Int

    enum CodingKeys: String, CodingKey {
        case packagePrice = "package_price"
        case offerPrice = "offer_price"
    }
}

let bookingArray = try? JSONDecoder().decode(Booking.self, from: data)
var results: [[[String]]] = []
for result in bookingArray?.results ?? [] {
    let packages = result.packages.map(\.name)
    let additionalMembers = result.additionalMembers.flatMap(\.packages).map(\.name)
    if additionalMembers.isEmpty {
        results.append([packages])
    } else {
        results.append([packages, additionalMembers])
    }
}

for res in results {
    print(res)
}

Должно напечатать:

[["Первый тест P-1", "Второй тест P-1", "Третий P-1"]]
[["Первый тест P-2", "Первый тест P-2"], ["Первый тест P-2 A-1", "Второй тест P-2 A-1", "Тест P-2 A-1 три", "P-2 A-1 Тест четыре", "P-2 A-2 Тест один", "P-2 A-2 Тест два", "P-2 A-3 Тест три", "P- 2 А-4 Тест четыре"]]
[["P-3 Тест первый"], ["P-3 A-1 Тест один", "P-3 A-1 Тест два", "P-3 A-1 Тест три", "P-3 A -1 Тест четвертый"]]


или даже проще

let results = bookingArray?.results.map { result in 
    let packages = result.packages.map(\.name)
    let additionalMembers = result.additionalMembers.flatMap(\.packages).map(\.name)
    return additionalMembers.isEmpty ? [packages] : [packages, additionalMembers]
} ?? []

Привет, Лео! Спасибо за ответ. Я пробовал использовать то же самое, но получил проблему, как показано ниже. «Невозможно определить тип ключевого пути из контекста; рассмотрите возможность явного указания корневого типа» и «Значение типа «[BookingListAdditionalMember]» не имеет пакетов-членов»

Abhishek kumar 18.06.2024 10:02

Просто проверьте правильное имя свойства вашей модели. Я использовал то же самое, что показано в вашем примере. Xcode должен автоматически заполнить его по истечении периода

Leo Dabus 18.06.2024 10:05

если я использую, пусть дополнительныеMembers = result.additional_members.flatMap(\.first?.packages).map(\.f‌​irst?.name) ошибка не отображается

Abhishek kumar 18.06.2024 10:10

Если вы отредактируете свой вопрос и опубликуете декларацию модели, я могу помочь вам исправить ее правильно.

Leo Dabus 18.06.2024 10:13

На самом деле модель представляет собой очень большие данные. Но позвольте мне попытаться получить только соответствующие данные.

Abhishek kumar 18.06.2024 10:17

@Abhishekkumar Проверьте мое последнее редактирование. При необходимости вы можете изменить модель.

Leo Dabus 18.06.2024 10:20

Существующая модель использует сопоставитель объектов. А предыдущий разработчик, работавший над этим проектом, создал функцию внутри модели представления и использовал ту же модель в функции callApi. Поэтому я пытаюсь сделать то же самое. но редактирование, которое вы предоставили, можно кодировать.

Abhishek kumar 18.06.2024 10:36

func getAllBookingListApiCall(){ params = ["page": pageCount]; viewModel.callGetApi(params: params) {status, data, errorMsg in if self.pageCount == 1 { self.bookingArray = data let bookings: [BookingListResults]? = data.results var activeOrderResults: [BookingListResults] = [] var PastOrderResults: [BookingListResults] = [] это функция, в которой я пытаюсь получить результат

Abhishek kumar 18.06.2024 10:41

Сделайте себе одолжение и избавьтесь от Object Mapper. Codable существует уже более 5 лет. Кстати, отредактируйте свой пост. Не публикуйте код в разделе комментариев.

Leo Dabus 18.06.2024 11:49

Да, в этом проекте есть многое, что необходимо обновить и изменить. Вот почему я ищу временное решение, где я могу использовать здесь массивы, чтобы решить проблему.

Abhishek kumar 18.06.2024 12:28

пусть bookingArray = попробовать? JSONDecoder().decode(Booking.self, from: data) Можете ли вы сказать мне, что мне следует использовать перед строкой выше? я написал код ниже: let jsonResponse = попробуйте JSONSerialization.jsonObject(with: data, options: .allowFragments) как AnyObject print("all data new==>>",jsonResponse) и также получаю ответ. но после этой строки пусть bookingArray = try? JSONDecoder().decode(Booking.self, from: data) становится пустым

Abhishek kumar 18.06.2024 21:33

Я опубликовал весь код, который вам нужен. data должен быть ответом данных в формате JSON от вашего бэкэнда. Вместо этого используйте do { let bookingArray = try JSONDecoder().decode(Booking.self, from: data) } catch { print(error) } и проверьте ошибку декодирования. Обязательно используйте собственный JSONDecoder, если вам нужна собственная dateDecodingStrategy.

Leo Dabus 19.06.2024 00:14

Я попробовал это, используя блок do-catch, и, наконец, получил ошибку, из-за которой получал пустой массив. Ошибка была «valueNotFound(Swift.Int, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: «results», intValue: nil))....» некоторые значения из ответа могут быть нулевыми. После удаления этих значений Я получил желаемый результат. Большое спасибо, Лео :).

Abhishek kumar 19.06.2024 07:58

Эй, Лео, можешь ли ты хоть раз взглянуть на этот вопрос ниже? stackoverflow.com/questions/78645988/…

Abhishek kumar 20.06.2024 09:15

Другие вопросы по теме