【问题标题】:how to filter current array using another array如何使用另一个数组过滤当前数组
【发布时间】:2018-11-12 09:59:51
【问题描述】:

假设我有如下数据。

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

【问题讨论】:

  • 所以你想要一个Dictionary,其键为roomTypes,其值为roomTypes 所在的房间?在任何情况下,您都应该在问题中包含数据结构而不是显示 JSON,因为在查看实际类型而不是其 JSON 表示时生成工作代码更容易。
  • @DávidPásztor :我想要与第一个数组相同的数组,但从第二个数组中过滤...我有主数组,我想获得满足第二个数组数据的酒店...所以我们要检查的是mainArray.prices.roomType 包含 roomFilter.roomType 我已经用我拥有的模型更新帖子...
  • 所以您只想过滤[Hotels] 以仅包括所有房间类型都存储在[RoomFilter] 中的酒店?您是否还想过滤掉Hotelsprices 数组,或者保留所有房间,即使是[RoomFilter] 中不存在的房间?一些通用建议:您应该使用单数形式命名您的类型,因为单个 Hotel 实例代表 1 个 Hotel,而不是多个,与 RoomPrices 相同。将 all 属性标记为可选和可变也是没有意义的。除非您有充分的理由不这样做,否则将所有内容声明为不可变和可选。
  • @DávidPásztor : 过滤一个 [Hotels] 以仅包括在 [RoomFilter] 中存储有任何个房间类型的酒店?

标签: swift filter swift4


【解决方案1】:

你可以这样做:

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
}

【讨论】:

  • 如果价格是字典,我必须在上面的逻辑中做些什么改变?
  • 你能提供一个示例字典吗?
【解决方案2】:

如果价格是字典:

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

【讨论】:

    【解决方案3】:

    您可以过滤Hotels 数组,以仅保留包含RoomPriceroomType 属性存在于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,而不是多个 RoomPrices。将 all 属性标记为可选和可变也是没有意义的。将所有内容声明为不可变和可选,除非您有充分的理由不这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      • 2012-03-06
      • 1970-01-01
      相关资源
      最近更新 更多