I am trying to get result by using a for loop inside nested response by not getting the required result. I have tried but not getting the desired response. Required result is as below.
[
[["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"]]
]
I am using below json response to get the required result.
{
"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"
}
]
}
]
}
]
}
Here in this response the parameter "additional_mamber" can be empty or can have multiple member or tests. I have used following code to get the result.
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)
But not getting the desired result.
Not sure why would you need a third level on your array but should be pretty straight forward using functional programing (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)
}
Should print:
[["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"]]
or even simpler
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]
} ?? []