如何用数组过滤Firebase获取的ForEach列表并兼容搜索栏功能
解决方案
你之前收到类型报错是因为直接尝试用字符串匹配选中分类数组,将分类筛选逻辑和搜索逻辑合并在同一个过滤闭包中即可实现两个功能同时生效,修改后的列表渲染代码如下:
ForEach(session.jobs.filter { job in // 分类筛选逻辑:无选中分类时全部通过,有选中则匹配岗位分类是否在选中列表内 let categoryMatch = selected.isEmpty || selected.contains(job.category ?? "") // 搜索逻辑:搜索框为空时全部通过,否则匹配岗位名称/公司/城市等可搜索字段 let searchMatch = searchText.isEmpty || (job.title?.localizedCaseInsensitiveContains(searchText) ?? false) || (job.company?.localizedCaseInsensitiveContains(searchText) ?? false) || (job.city?.localizedCaseInsensitiveContains(searchText) ?? false) return categoryMatch && searchMatch }) { job in JobCardTemplate(job: job, session: self.session) }
注意事项
- 不要再将整个
Job对象转成字符串做包含匹配,明确指定需要搜索的字段可以避免匹配到id、创建者id这类不想暴露给用户的内部字段 localizedCaseInsensitiveContains可以实现不区分大小写的搜索,优化用户体验- 代码中对可选值做了默认空值处理,不会因为字段为空触发崩溃
- 如果需要新增其他搜索框(比如你注释的
searchText2),只要在searchMatch判断中新增对应字段的匹配逻辑即可 - 注意保证筛选按钮的分类标题和
JobData中category字段的取值完全一致,否则会出现匹配失效的问题
内容的提问来源于stack exchange,提问作者Pakenas
相关产品推荐
相关产品推荐

