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

自定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:21:22