You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于内部价格数组的范围过滤酒店数据数组?

多价格酒店数组的范围过滤实现方案

我明白你现在的困扰——之前只处理单价格字段的过滤逻辑,现在每个酒店有多个房间价格,原来取第一个价格的逻辑肯定不对了。根据你给出的需求场景,我们需要调整过滤逻辑来匹配多价格数组的情况。

先明确需求逻辑:

  • 当价格范围是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:13:38