如何用JavaScript匹配数组集合与目标数组并获取匹配度最高的数组
解决URL路径片段匹配度最高的数组问题
我懂你现在的需求——就是想从拆分后的二维数组里,找出和目标URL路径片段匹配度最高的那一项对吧?咱们先从梳理你的代码开始,一步步调整解决问题。
先优化基础的拆分逻辑
你已经完成了URL路径拆分的基础工作,但这里有个小细节可以优化:split("/")处理URL路径时,开头会多出一个空字符串(因为pathname是从/开始的),加上filter去掉空片段能让后续匹配更准确。先看调整后的基础代码:
const urlArray = [ "https://example.com/rating", "https://example.com/property", "https://example.com/rating/on", ]; const urlArraySplit = urlArray.map((url) => { return new URL(url).pathname.split("/").filter(segment => segment); }); console.log(urlArraySplit); // 输出:[["rating"], ["property"], ["rating", "on"]] const targetUrl = 'https://example.com/rating/on/45/45'; const targetArray = new URL(targetUrl).pathname.split("/").filter(segment => segment); // targetArray 结果:["rating", "on", "45", "45"]
核心逻辑:计算匹配度并找到最优项
URL路径是层级化的,所以前缀匹配的长度越长,匹配度越高。比如目标数组是["rating", "on", "45", "45"],和["rating", "on"]的前缀匹配长度是2,和["rating"]是1,和["property"]是0,显然前者匹配度最高。
下面是实现这个逻辑的代码:
// 计算单个候选数组和目标数组的前缀匹配长度 function getMatchLength(candidate, target) { let matchCount = 0; // 逐段对比前缀,不匹配就立刻停止 for (let i = 0; i < candidate.length; i++) { if (candidate[i] === target[i]) { matchCount++; } else { break; } } return matchCount; } // 遍历所有候选数组,找到匹配度最高的那一个 function findBestMatch(candidates, target) { let bestMatch = null; let maxMatchCount = -1; candidates.forEach(candidate => { const currentCount = getMatchLength(candidate, target); // 优先选匹配长度更长的;长度相同则选更短的数组(避免冗余片段) if (currentCount > maxMatchCount || (currentCount === maxMatchCount && candidate.length < (bestMatch?.length || Infinity))) { maxMatchCount = currentCount; bestMatch = candidate; } }); return bestMatch; } // 调用函数获取结果 const bestMatchArray = findBestMatch(urlArraySplit, targetArray); console.log(bestMatchArray); // 输出:["rating", "on"]
逻辑说明
- 前缀匹配的规则完全贴合URL路径的层级特性,比如
/rating/on比/rating更贴合/rating/on/45/45的路径结构 - 额外处理了匹配长度相同的情况,确保不会选到冗余的长数组,结果更精准
把这些代码整合运行,就能得到你想要的匹配度最高的数组啦。
内容的提问来源于stack exchange,提问作者ramb tumber
相关产品推荐
相关产品推荐

