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; });
错误点有两个:
- 不符合
Array.sort比较函数的返回值规则:比较函数返回值小于0时a排在b前,大于0时b排在a前,等于0时二者相对位置不变。原代码返回A + B,恒为非负数,会直接打乱排序逻辑,按匹配度降序排列应该返回B - A。 - 匹配度计数逻辑没有做连续前缀截断:如果某一位已经不匹配,后续位置就算字符对应相等也不属于前缀匹配范畴,会导致得分计算不准。
修复后可运行代码
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
相关产品推荐
相关产品推荐

