如何在Flutter与Firebase Firestore中实现价格区间筛选功能
价格区间筛选功能实现方案
核心逻辑为:先对输入的最小、最大价格做合法性校验,再判断每条数据的价格字段是否满足 最小价格 ≤ 目标价格 ≤ 最大价格 条件,满足条件的数据即为筛选结果。以下是不同场景的具体实现方式:
前端JS数组筛选实现
- 输入校验规则
- 空值处理:如果用户未输入最小价格,默认设为
0;未输入最大价格,默认设为无穷大Infinity - 类型转换:将输入的字符串格式价格转成Number类型,避免字符串比较出现逻辑错误
- 边界校验:如果最小价格大于最大价格,自动交换两个值,也可根据业务需求直接提示用户输入错误
- 空值处理:如果用户未输入最小价格,默认设为
- 代码示例
// 示例数据源 const productList = [ {id: 1, name: '商品A', price: 29.9}, {id: 2, name: '商品B', price: 99.9}, {id: 3, name: '商品C', price: 159}, {id: 4, name: '商品D', price: 299} ] // 筛选函数 function filterByPriceRange(list, minInput, maxInput) { // 处理输入值 const minPrice = isNaN(Number(minInput)) ? 0 : Number(minInput) const maxPrice = isNaN(Number(maxInput)) ? Infinity : Number(maxInput) const actualMin = Math.min(minPrice, maxPrice) const actualMax = Math.max(minPrice, maxPrice) // 执行筛选 return list.filter(item => item.price >= actualMin && item.price <= actualMax) } // 调用示例:筛选价格在50~200之间的商品 const result = filterByPriceRange(productList, 50, 200) // 输出结果包含商品B、商品C
后端SQL查询实现
如果直接从数据库查询筛选结果,可直接在WHERE条件中加区间判断,同时处理参数为空的场景:
-- 示例:查询price在minPrice和maxPrice区间的商品 SELECT * FROM products WHERE price >= COALESCE(?, 0) -- ?为传入的最小价格参数,为空时默认从0开始 AND price <= COALESCE(?, 99999999) -- ?为传入的最大价格参数,为空时默认到足够大的数值
如果需要兼容最小价格大于最大价格的异常输入,可以用LEAST和GREATEST函数处理:
SELECT * FROM products WHERE price >= LEAST(COALESCE(?, 0), COALESCE(?, 99999999)) AND price <= GREATEST(COALESCE(?, 0), COALESCE(?, 99999999))
注意:如果你的价格字段存储的是分单位的整数(用于避免浮点精度问题),需要先把传入的元单位价格乘以100转成分之后再做比较。
内容的提问来源于stack exchange,提问作者Rasm Mdv
相关产品推荐
相关产品推荐

