JavaScript根据标签数组过滤对象数组并匹配属性子字符串的实现问题
问题排查
你现有代码不符合预期的核心原因有2点:
- 你调用的是
Array.includes(),该方法判断的是「对象的某个属性值完全等于搜索标签」,而非「属性值字符串包含搜索标签子串」 - 未处理大小写匹配问题,容易出现大小写不一致导致匹配失败的情况
正则实现方案
实现前需要先对搜索标签里的正则特殊字符做转义,避免标签包含.、*等特殊字符时匹配逻辑异常,完整代码如下:
// 正则特殊字符转义工具函数 function escapeRegExp(string) { return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); } // 过滤逻辑 const filteredResult = arrayOfObjects.filter(object => { // 要求所有搜索标签都匹配命中 return searchTags.every(tag => { // 生成不区分大小写的子串匹配正则,不需要忽略大小写可以去掉i参数 const matchReg = new RegExp(escapeRegExp(tag), 'i'); // 要求对象至少有一个属性值包含当前标签子串 return Object.values(object).some(value => { // 非字符串类型属性值先转为字符串再匹配 return matchReg.test(String(value)); }) }) })
用你提供的测试数据运行以上代码,会正确返回第一个符合要求的对象。
更轻量的非正则实现
如果没有复杂的匹配规则需求,用String.includes()实现性能更高,也不需要处理正则转义:
const filteredResult = arrayOfObjects.filter(object => { return searchTags.every(tag => { const lowerCaseTag = tag.toLowerCase(); return Object.values(object).some(value => { return String(value).toLowerCase().includes(lowerCaseTag); }) }) })
内容的提问来源于stack exchange,提问作者Alexandru Filipescu
相关产品推荐
相关产品推荐

