代码之家  ›  专栏  ›  技术社区  ›  Fahim Parkar

如何使用另一个数组筛选当前数组

  •  -2
  • Fahim Parkar  · 技术社区  · 7 年前

    假设我有如下数据。

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

    价格仅为1本字典

    [
        {
            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 回复  |  直到 7 年前
        1
  •  0
  •   Dávid Pásztor    7 年前

    你可以过滤一个数组 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
    })
    

    一些一般建议:您应该使用单数形式命名类型,因为 酒店 实例表示1 酒店 ,不是几个,相同的 房价 在美国,标记也没有意义 全部的 属性是可选的和可变的。声明所有内容都是不可变的和可选的,除非您有充分的理由不这样做。

        2
  •  1
  •   Andrey Volobuev    7 年前

    你可以这样做:

    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
    }
    
        3
  •  1
  •   Andrey Volobuev    7 年前

    如果价格是字典:

    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
        }
    }