如何基于内部价格数组的范围过滤酒店数据数组?
多价格酒店数组的范围过滤实现方案
我明白你现在的困扰——之前只处理单价格字段的过滤逻辑,现在每个酒店有多个房间价格,原来取第一个价格的逻辑肯定不对了。根据你给出的需求场景,我们需要调整过滤逻辑来匹配多价格数组的情况。
先明确需求逻辑:
- 当价格范围是1231-1233时,仅返回Hotel 1(因为Hotel 2的所有房间价格都超出这个区间)
- 当价格范围是1231-1431时,返回两个酒店(它们都有房间价格落在区间内)
核心思路是:判断每个酒店的房间价格数组中,是否至少有一个价格落在指定的[minValue, maxValue]区间内,如果是就保留该酒店。
下面是修正后的Swift代码,同时做了安全解包处理避免崩溃:
finalArray = finalArray.filter { hotel in // 安全解包prices数组,空数组的酒店直接过滤掉 guard let prices = hotel.prices else { return false } // 检查是否存在符合价格范围的房间 return prices.contains { priceItem in // 安全解包price值并转换为CGFloat guard let price = priceItem.price, let priceCGFloat = CGFloat(exactly: price) else { return false } return priceCGFloat >= minValue && priceCGFloat <= maxValue } }
代码关键点说明:
- 用
guard let替代强制解包(!),避免数组或价格为空时的崩溃问题 - 使用
contains(where:)方法简洁高效地检查数组中是否存在符合条件的元素,比手动循环更易读 - 用
CGFloat(exactly:)处理价格类型转换,比直接强制转换更安全,能处理整数转浮点数的边界情况
如果你之后有特殊需求,比如要求酒店的所有房间价格都必须落在区间内才保留(虽然你的例子不需要,但可以参考),可以把contains换成allSatisfy:
finalArray = finalArray.filter { hotel in guard let prices = hotel.prices else { return false } // 检查所有房间价格都在指定范围内 return prices.allSatisfy { priceItem in guard let price = priceItem.price, let priceCGFloat = CGFloat(exactly: price) else { return false } return priceCGFloat >= minValue && priceCGFloat <= maxValue } }
内容的提问来源于stack exchange,提问作者Fahim Parkar
相关产品推荐
相关产品推荐

