как фильтровать массив, когда у нас есть внутренний массив и нам нужно применить фильтр к внутреннему массиву - PullRequest
0 голосов
/ 30 мая 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
                    },
                ]
    }
]

Я хочу отфильтровать отели по цене.

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

диапазон цен от 1231-1233 >> Это вернет мне только отель 1.

диапазон цен от 1231-1431 >> Это вернет мне отель 1 и отель 2.

У меня фильтр того же типа, но там у меня была только 1 цена, поэтому я делал следующее:

finalArray = finalArray.filter() {
                    CGFloat(($0.prices![0].price)!) >= minValue 
                    &&
                    CGFloat(($0.prices![0].price)!) <= maxValue
             }

Однако теперь у меня есть массив цен, поэтому я не уверен, каксправиться в этом случае.

Проблема в строке

$0.prices![0].price
          ^^^

Может кто-нибудь указать мне правильное направление, как добиться этого фильтра?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

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

struct Price {
   let roomType: String
   let price: Double
}

struct Hotel {
   let hotelName: String
   let hotelType: Int
   let prices: [Price]
}

let hotel1 = Hotel(hotelName: "Hotel 1", hotelType: 1, prices: [
    Price(roomType: "Single Room", price: 1231),
    Price(roomType: "Twin Room", price: 1232),
    Price(roomType: "Triple Room", price: 1233)
])

let hotel2 = Hotel(hotelName: "Hotel 2", hotelType: 1, prices: [
    Price(roomType: "Single Room", price: 1241),
    Price(roomType: "Twin Room", price: 1242),
    Price(roomType: "Triple Room", price: 1243)
])

func getHotelsInRange(_ hotels: [Hotel],
                      from min: Double,
                      to max: Double) -> [Hotel] {
    return hotels.filter { h in
        h.prices.contains{ p in
            switch p.price {
            case min...max:
                return true
            default:
                return false
            }
        }
    }
}

let result = getHotelsInRange([hotel1, hotel2], from: min, to: max)
0 голосов
/ 30 мая 2018

Вам просто нужно проверить, есть ли какие-либо элементы в массиве prices, которые не соответствуют критерию.Вы можете добиться этого, используя Array.contains с отрицательными предикатами, так что contains возвращается, как только вы обнаружите неправильное значение (т. Е. Проверьте значения, которые меньше минимального или значения больше максимального).

finalArray = finalArray.filter() { hotelInfo in
    !hotelInfo.prices!.contains(where: {CGFloat($0) <= minValue}) && !hotelInfo.prices!.contains(where: {CGFloat($0) >= maxValue})
}
...