Powiedzmy, że mam dane jak poniżej.

[
    {
        hotelName : "Hotel 1",
        hotelType : 1
        prices : 
                [
                    {
                        roomType: "Single Room",
                        price : 1231
                    },
                    {
                        roomType: "Twin Room",
                        price : 1232
                    },
                    {
                        roomType: "Triple Room",
                        price : 1233
                    }
                ]
    },
    {
        hotelName : "Hotel 2",
        hotelType : 2
        prices : 
                [
                    {
                        roomType: "Single Room",
                        price : 1241
                    },
                    {
                        roomType: "Twin Room",
                        price : 1242
                    },
                    {
                        roomType: "Triple Room",
                        price : 1243
                    }
                ]
    }
]

Mam kolejną tablicę do filtrowania poniżej formatu.

[
    {
        "roomType": "Single Room"
    },
    {
        "roomType": "Twin Room"
    }
]

Chcę uzyskać pokój, który ma powyżej typy.

Próbuję się poniżej, ale utknąłem w poniższym punkcie.

    finalArray = finalArray.filter() {
        hotelInfo in
        hotelInfo.prices!.roomType!==(
            // compare for roomType from another array
        )
    }

Czy ktoś mógłby mi wskazać we właściwym kierunku?


Struktura mam jak poniżej.

struct Hotels: Encodable, Decodable {
    var hotelName: String?
    var hotelType: Int?
    var prices: [RoomPrices]?
}

struct RoomPrices: Encodable, Decodable {
    var roomType: String?
    var price: Double?
}

Do filtra mam model jak poniżej

struct RoomFilter: Decodable {
    var roomType: String?
}

Ceny tylko 1 słownik

[
    {
        hotelName : "Hotel 1",
        hotelType : 1
        prices : 
                    {
                        roomType: "Single Room",
                        price : 1231
                    }
    },
    {
        hotelName : "Hotel 2",
        hotelType : 2
        prices : 

                    {
                        roomType: "Twin Room",
                        price : 1242
                    }

    }
]

Zaktualizowany struktura będzie

struct Hotels: Encodable, Decodable {
    var hotelName: String?
    var hotelType: Int?
    var prices: RoomPrices?
}

struct RoomPrices: Encodable, Decodable {
    var roomType: String?
    var price: Double?
}
-2
Fahim Parkar 2 czerwiec 2018, 16:18

3 odpowiedzi

Najlepsza odpowiedź

Możesz przefiltrować tablicę Hotel S, aby zachować tylko hotele zawierające RoomPrice, którego roomType jest obecny w tablicy RoomFilter za pomocą dwóch zagnieżdżonych contains(where:) Połączenia wewnątrz filter, jedno wyszukiwanie Hotel.prices i drugie wyszukiwanie roomFilters, aby sprawdzić, czy istnieje co najmniej jeden wspólny element między dwoma tablicami.

let filteredHotels = hotels.filter({ hotel in
    hotel.prices?.contains(where: { room in roomFilters.contains(where: {$0.roomType == room.roomType})}) ?? false
})

Niektóre informacje ogólne: należy nazwać typy za pomocą pojedynczej formy, ponieważ pojedyncza instancja Hotel reprezentuje 1 Hotel, a nie kilka, takich samych dla RoomPrice s. Nie ma też sensu, aby oznaczyć właściwości wszystkie jako opcjonalne i niezmienne. Oznakuj wszystko jako niezmienne i opcjonalne, chyba że masz dobry powodu, aby tego nie robić.

0
Dávid Pásztor 2 czerwiec 2018, 15:25

Możesz to zrobić w ten sposób:

let roomTypes = [RoomFilter(roomType: "Twin Room"), RoomFilter(roomType: "Single Room")]

let result = hotels.filter { hotel in
    hotel.prices?.contains { price in
        roomTypes.contains { rt in
            rt.roomType == price.roomType
        }
    } ?? false
}
1
Andrey Volobuev 2 czerwiec 2018, 15:50

W przypadku, gdy cena jest słownikiem:

let roomTypes = [RoomFilter(roomType: "Twin Room"), RoomFilter(roomType: "Single Room")]

let result = hotels.filter { hotel in
    roomTypes.contains { filterRoomType in
        filterRoomType.roomType == hotel.price?.roomType
    }
}
1
Andrey Volobuev 5 czerwiec 2018, 09:01