JavaScript如何高效实现忽略大小写的对象键正则匹配查询
实现忽略大小写匹配字典键的高效方案
你的嵌套循环正则方案存在两个明显问题:
- 时间复杂度高:每查询一个单词都要遍历所有字典键,整体复杂度是
O(单词数量 * 字典键数量),数据量大时性能差 - 匹配不准确:正则
test是模糊匹配,只要键包含查询词就会命中,且查询词包含正则元字符(如.、*、+)时会出现预期外的匹配结果,无法实现精确的忽略大小写匹配
最优方案:预处理字典实现O(1)查询
如果字典是固定的,提前做一次归一化处理,把所有键统一转为小写(或大写),后续查询时把待匹配单词也转为相同格式,就可以直接用in运算符或者hasOwnProperty、Object.hasOwn做O(1)的快速判断:
let dictionary = { aaa : 'value1', bbb : 'value2', ccc : 'value3' } // 字典归一化,仅需执行一次 const normalizedDict = Object.fromEntries( Object.entries(dictionary).map(([key, val]) => [key.toLowerCase(), val]) ) let wordsArr = ['dfjd', 'aaa', 'Bbb', 'dfjkd'] for (let word of wordsArr) { const normalizedWord = word.toLowerCase() // 直接用O(1)的方法判断 if (normalizedWord in normalizedDict) { console.log(word, 'is in dictionary') } }
如果你的原字典键本身就统一为全小写(就像示例中的aaa、bbb),连预处理步骤都可以省略,直接把待查询单词转小写后匹配原字典即可:
// 原字典键全为小写的极简写法 for (let word of wordsArr) { if (word.toLowerCase() in dictionary) { console.log(word, 'is in dictionary') } }
如果字典需要动态增改,每次新增键的时候也统一转成小写存储,就可以一直保持O(1)的查询效率。
内容的提问来源于stack exchange,提问作者Sara
相关产品推荐
相关产品推荐

