自定义JavaScript字符串匹配函数及数组匹配逻辑BUG排查
修复字符串数组匹配逻辑的错误问题
首先,咱们直接定位你代码里的核心bug:在初始化每个t[i]的匹配结果f时,你错误地写了t[0]而不是当前循环的t[i]。这就导致处理第三个元素t[2](也就是"35")时,结果里的T元素还被硬写成了t[0]的"350",完全没用到当前的t[i]。
除此之外,你的代码还有两个可以优化的点:一是MyFunction存在字符串越界的潜在问题,二是重复调用匹配函数会浪费性能。下面咱们一步步解决:
1. 修复核心初始化错误
在遍历t数组的循环里,初始化f的代码原本是:
f = [ [t[0]], [v[0]] ];
把t[0]改成当前的t[i]就可以解决结果复用的问题:
f = [ [t[i]], [v[0]] ];
2. 优化字符串匹配函数MyFunction
原函数在处理一个字符串是另一个前缀的情况时(比如"35"和"3506"),如果循环到较短字符串的长度之外,会读取charCodeAt的NaN值,导致比较出错。咱们优化一下逻辑,同时简化代码:
function MyFunction(a, b) { // 完全相等直接返回长度 if (a === b) return a.length; // 首字符不同直接返回0 if (a[0] !== b[0]) return 0; let matchCount = 1; // 取两个字符串的最小长度,避免越界 const minLen = Math.min(a.length, b.length); // 从第二个字符开始逐一比较 for (let i = 1; i < minLen; i++) { if (a[i] === b[i]) { matchCount++; } else { // 出现不同字符立即停止循环 break; } } return matchCount; }
3. 减少重复函数调用,优化性能
原代码里在判断条件时多次重复调用MyFunction(v[j], t[i]),完全可以把结果存到一个变量里,避免重复计算:
完整修复后的代码
function MyFunction(a, b) { if (a === b) return a.length; if (a[0] !== b[0]) return 0; let matchCount = 1; const minLen = Math.min(a.length, b.length); for (let i = 1; i < minLen; i++) { if (a[i] === b[i]) { matchCount++; } else { break; } } return matchCount; } const t = ["350", "840", "35"], v = ["3506", "35077", "84"]; const result = []; for (let i = 0; i < t.length; i++) { const currentT = t[i]; // 初始化当前最优匹配为v的第一个元素 let maxMatch = MyFunction(v[0], currentT); let bestV = v[0]; let bestVLength = v[0].length; for (let j = 1; j < v.length; j++) { const currentV = v[j]; // 只计算一次当前匹配度 const currentMatch = MyFunction(currentV, currentT); const currentVLength = currentV.length; // 判断是否更新最优匹配 if (currentMatch > maxMatch) { maxMatch = currentMatch; bestV = currentV; bestVLength = currentVLength; } else if (currentMatch === maxMatch) { // 匹配度相同时,选择长度更短的V元素 if (currentVLength < bestVLength) { bestV = currentV; bestVLength = currentVLength; } } } // 保存当前结果并打印 const currentResult = [[currentT], [bestV]]; result.push(currentResult); console.log(currentResult); }
运行结果验证
修复后运行代码,会得到正确的输出:
[["350"], ["3506"]](正确)[["840"], ["84"]](正确)[["35"], ["3506"]](正确,匹配度相同,选择了更短的"3506"而非"35077")
内容的提问来源于stack exchange,提问作者Faouzitam
相关产品推荐
相关产品推荐

