как отфильтровать текущий массив, используя другой массив - PullRequest
0 голосов
/ 02 июня 2018

Допустим, у меня есть данные, как показано ниже.

[
    {
        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
                    }
                ]
    }
]

У меня есть другой массив для фильтра в следующем формате.

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

То, что я хочу получить, это получить номер, который имеет вышеТипы.

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

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

Может ли кто-нибудь направить меня в правильном направлении?


Структура, которую я имею, этокак показано ниже.

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

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

Для фильтра у меня есть модель, как показано ниже

struct RoomFilter: Decodable {
    var roomType: String?
}

Цены только для одного словаря

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

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

    }
]

Обновленная структура будет

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

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

Ответы [ 3 ]

0 голосов
/ 02 июня 2018

Вы можете сделать это так:

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
}
0 голосов
/ 05 июня 2018

В случае, если цена является словарем:

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
    }
}
0 голосов
/ 02 июня 2018

Вы можете отфильтровать массив Hotel s, чтобы сохранить только отели, которые содержат RoomPrice, свойство roomType которого присутствует в массиве RoomFilter, используя два вложенных вызова contains(where:) внутри вашего filter,один ищет Hotel.prices, а другой ищет roomFilters, чтобы увидеть, есть ли хотя бы один общий элемент между двумя массивами.

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

Несколько общих советов: вы должны называть свои типы, используя единственную форму, поскольку один экземпляр Hotel представляет 1 Hotel, а не несколько экземпляров, то же самое для RoomPrice с.Также не имеет смысла отмечать все свойства как необязательные и изменяемые.Объявите все как неизменное и необязательное, если у вас нет веских причин не делать этого.

...