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

JavaScript如何按目标串匹配命中度正确排序字符串数组

字符串数组按目标串前缀匹配度排序问题

现有基础信息

  • 待排序字符串数组:
const arr = ['ACST', 'CST', 'CCST'];
  • 目标匹配常量:
const word = 'CS';
  • 期望排序结果:
const newArr = ['CST', 'CCST', 'ACST'];

原有代码问题

原有排序逻辑运行后实际输出顺序为CCST -> CST -> ACST,不符合预期,错误代码如下:

arr.sort((a, b) => {
    let A = 0;
    let B = 0;
    for (let i = 0; i < word.length; i++) {
        if (a.charAt(i) === word.charAt(i)) {
            A++;
        }
        if (b.charAt(i) === word.charAt(i)) {
            B++;
        }
    }
    return A + B;
});

错误点有两个:

  1. 不符合Array.sort比较函数的返回值规则:比较函数返回值小于0时a排在b前,大于0时b排在a前,等于0时二者相对位置不变。原代码返回A + B,恒为非负数,会直接打乱排序逻辑,按匹配度降序排列应该返回B - A。
  2. 匹配度计数逻辑没有做连续前缀截断:如果某一位已经不匹配,后续位置就算字符对应相等也不属于前缀匹配范畴,会导致得分计算不准。

修复后可运行代码

const arr = ['ACST', 'CST', 'CCST'];
const word = 'CS';

// 计算字符串与目标串的前缀连续匹配得分
function getMatchScore(str, target) {
    let score = 0;
    for (let i = 0; i < target.length; i++) {
        if (str[i] === target[i]) {
            score++;
        } else {
            // 遇到不匹配字符直接终止计数,仅统计连续前缀匹配长度
            break;
        }
    }
    return score;
}

const newArr = arr.sort((a, b) => {
    const scoreA = getMatchScore(a, word);
    const scoreB = getMatchScore(b, word);
    // 匹配度高的字符串排在前面
    return scoreB - scoreA;
});

// 运行后newArr输出为 ['CST', 'CCST', 'ACST'],符合预期

内容的提问来源于stack exchange,提问作者Glupiy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 09:39:19