如何在JavaScript一维对象数组中实现SQL LIKE式不区分大小写过滤?
JavaScript实现类似SQL LIKE的不区分大小写模糊匹配
原始数据
var data = [ { "empId": 63758, "empCode": "000003A", "empName": "Robert", }, { "empId": 63759, "empCode": "000003B", "empName": "Paul John", }, { "empId": 63760, "empCode": "000003C", "empName": "Chris John", }, ];
需求
实现类似SQL查询中LIKE '%john%'的效果,不区分大小写过滤出empName包含"john"的条目,最终得到以下结果:
var data = [ { "empId": 63759, "empCode": "000003B", "empName": "Paul John", }, { "empId": 63760, "empCode": "000003C", "empName": "Chris John", }, ];
原代码问题
你尝试的代码仅支持完整文本匹配,无法实现模糊匹配:
var filter = { "empName": "Chris John" } data = data.filter(function(item){ for(var key in filter){ if(item[key] == undefined || item[key] != filter[key]) return false } return true });
解决方案
方案1:单字段模糊匹配(简单直观)
通过toLowerCase()统一大小写,再用includes()判断子串是否存在,实现不区分大小写的模糊匹配:
var data = [ // 原始数据同上 ]; // 目标匹配关键词 const matchKeyword = "john"; // 过滤逻辑 const filteredData = data.filter(item => { // 可选链操作符?.避免empName为undefined时报错 return item.empName?.toLowerCase().includes(matchKeyword.toLowerCase()); }); console.log(filteredData);
方案2:兼容多字段的模糊匹配(复用原filter对象格式)
如果需要支持多个字段的模糊匹配,可修改遍历逻辑,对每个过滤字段执行包含判断:
var data = [ // 原始数据同上 ]; // 定义过滤规则,键为字段名,值为要匹配的关键词 const filter = { "empName": "john" }; const filteredData = data.filter(item => { for (const key in filter) { const target = filter[key].toLowerCase(); const itemValue = item[key]?.toLowerCase(); // 字段不存在或不包含目标关键词则排除 if (!itemValue || !itemValue.includes(target)) { return false; } } // 所有过滤条件满足则保留 return true; }); console.log(filteredData);
核心逻辑说明
toLowerCase():将目标文本和匹配关键词统一转为小写,消除大小写差异,实现不区分大小写匹配。includes():判断字符串是否包含指定子串,对应SQL中%xxx%的模糊匹配逻辑。?.:可选链操作符,防止字段不存在时调用toLowerCase()抛出错误。
内容的提问来源于stack exchange,提问作者smlos
相关产品推荐
相关产品推荐

