纯前端多条件筛选应统一用配置对象管理字段(如{category: '', status: '', keyword: ''}),配合filter()与every()实现同步高效匹配;中文输入需防抖或监听compositionend;模糊搜索推荐toLowerCase().includes(),渲染用DocumentFragment批量插入。

纯前端多条件筛选不需要后端参与,关键在于数据结构组织和匹配逻辑的轻量设计。几百条以内 JSON 数据用 Array.filter() 配合 every() 就能跑得飞快,没必要上框架。
多条件筛选的数据结构怎么组织才好写逻辑
别把条件塞进一堆独立的 <input> 然后手动拼对象。直接用一个统一的配置对象管理所有筛选字段,比如:
const filters = {
category: '',
status: '',
keyword: ''
};
每次输入更新对应字段,再统一走一次过滤函数。这样新增条件只要加个 key,不用改主逻辑。
- 每个筛选项的值建议用字符串(空字符串表示“不限”),避免
null/undefined判断分支爆炸 - 如果某个字段是多选(如标签),值存成数组,
includes()比==更安全 - 不要在
filter()里调用异步操作——纯前端筛选必须同步执行,否则 UI 会卡顿或错乱
实时匹配时怎么避免中文输入法中途触发误筛
用户用中文输入法打“北京”,在“北”字出来、“京”字还没上屏前就触发了 input 事件,导致筛出一堆“北”开头的垃圾结果。这不是 bug,是标准行为。
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
立即学习“前端免费学习笔记(深入)”;
- 监听
compositionstart和compositionend事件,只在compositionend后才执行过滤 - 或者更简单:加个 200ms 防抖,但注意防抖要清掉 composition 过程中的中间态,否则可能漏掉最终结果
-
event.isComposing是现代浏览器的判断依据,但 IE 完全不支持,若需兼容旧环境,老老实实用 composition 事件对
keyword 模糊匹配该用 indexOf 还是 includes 还是正则
三者性能差异在千条数据内几乎可忽略,选哪个取决于你要不要支持大小写不敏感、要不要高亮、要不要全角半角归一化。
-
str.toLowerCase().includes(keyword.toLowerCase())最常用,够用且易读 - 用
indexOf可以拿到位置,方便后续做高亮;但要注意它返回-1表示没找到,别直接当布尔值用 - 正则适合复杂场景(比如排除某些词、支持通配符),但每次
new RegExp()有开销,建议缓存编译后的RegExp实例 - 别忘了处理全角空格:
keyword.replace(/[\u3000]/g, ' '),否则用户输全角空格搜不出结果
筛选结果渲染慢?别直接 innerHTML 拼接
DOM 批量更新是瓶颈。尤其在频繁输入时,每输一个字都重 render 整个列表,滚动会跳、焦点会丢。
- 用
DocumentFragment先建好所有<li>,最后一次性 append 到容器里 - 如果列表很长(比如 >200 条),考虑虚拟滚动,但多数小项目真用不到——先测,别预设性能问题
- 避免在渲染循环里反复查 DOM 节点,比如
document.querySelector('.result-list')提前存变量 - 高亮关键词时,别用
innerHTML += ...,容易 XSS;用textContent+span包裹,再用insertAdjacentElement插入
最常被忽略的一点:筛选条件变更后,记得重置分页状态(如果有)和滚动位置。用户切个分类再搜,结果列表突然从第 3 页开始显示,体验会断层。


















