如何不使用正则实现JS字符串数组筛选及匹配优先级排序
无正则实现方案
核心思路
全程使用原生字符串、数组方法完成,不需要依赖正则,逻辑拆为筛选标记、排序输出两个阶段:
- 预处理目标字符:提前将待匹配的首字符转为小写,统一大小写判断基准,避免大小写差异导致匹配遗漏
- 筛选+优先级标记:遍历原数组的每一项,给符合匹配规则的项打上优先级标记:
- 若当前字符串整体的首字符(转小写)和目标字符一致,标记为最高优先级
1,这类项最终排在结果最前面 - 若整体首字符不匹配,就把字符串按空格拆分为独立单词片段,逐个检查每个单词的首字符(转小写)是否匹配目标字符,只要存在任意一个匹配的单词,就标记为次优先级
2 - 两类标记的项都纳入待排序列表,完全没有匹配单词的项直接过滤
- 若当前字符串整体的首字符(转小写)和目标字符一致,标记为最高优先级
- 排序输出:对待排序列表按优先级升序排序,最后提取原始字符串内容,就是符合要求的结果
可运行代码
const fruits = ["apple orange", "Orange", "banana", "banana", "apple"] const character = "o" const targetChar = character.toLowerCase() const matchedEntries = fruits.reduce((collect, item) => { // 优先判断整串首字符匹配的高优先级场景 if (item.charAt(0).toLowerCase() === targetChar) { collect.push({ value: item, priority: 1 }) return collect } // 拆分单词检查内部匹配 const wordList = item.split(' ') const hasMatchedWord = wordList.some(word => { // 跳过空片段,兼容首尾/连续多空格的异常场景 if (!word.trim()) return false return word.charAt(0).toLowerCase() === targetChar }) if (hasMatchedWord) { collect.push({ value: item, priority: 2 }) } return collect }, []) // 排序后取原值得到最终结果 const filterdFruits = matchedEntries .sort((a, b) => a.priority - b.priority) .map(entry => entry.value) console.log(filterdFruits) // 输出: [ 'Orange', 'apple orange' ]
兼容性说明
拆分单词后加了空片段判断,即使字符串存在首尾空格、单词间连续多个空格的情况,也不会出现匹配错误。
内容的提问来源于stack exchange,提问作者user2824374
相关产品推荐
相关产品推荐

