You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用正则实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 21:39:04