如何计算两组字符串的相似度百分比?基于索引位置匹配的JavaScript实现问询
字符串位置匹配相似度计算(JavaScript实现)
问题1:怎么计算两组字符串的相同位置匹配占比?
其实核心逻辑很简单,分三步就行:
- 先确定有效比较长度:通常取两个字符串的最小长度——毕竟短字符串之外的位置,长字符串的字符没地方对应匹配
- 逐个遍历索引位置,统计两个字符串在同一位置字符完全相同的次数
- 最后用「匹配次数 ÷ 有效比较长度」算出占比,转成百分比格式就搞定了
如果你的需求是把长字符串超出的部分都算成不匹配,那把分母换成两个字符串的最大长度就行,根据实际场景调整~
问题2:针对你的字符串集合的具体实现
针对你给出的这个键值对集合,我写了个简洁的实现,直接就能用:
首先封装一个通用的相似度计算函数,复用性拉满:
function calculatePositionSimilarity(str1, str2) { // 处理空字符串的边界情况,避免报错 if (!str1 || !str2) return '0.00%'; const minLength = Math.min(str1.length, str2.length); let matchCount = 0; // 遍历每个位置,统计匹配的字符数 for (let i = 0; i < minLength; i++) { if (str1[i] === str2[i]) { matchCount++; } } // 计算百分比并保留两位小数,格式更友好 return ((matchCount / minLength) * 100).toFixed(2) + '%'; }
然后遍历你的集合,批量计算每组的相似度:
// 你的字符串集合 const stringCollection = { 0: { question: "1f31f", answer: "1f31a" }, 1: { question: "1f32f", answer: "1fada" } }; // 遍历处理每一组 Object.entries(stringCollection).forEach(([key, item]) => { const similarity = calculatePositionSimilarity(item.question, item.answer); console.log(`第${parseInt(key)+1}组(question vs answer)的位置匹配相似度:${similarity}`); });
运行结果:
第1组(question vs answer)的位置匹配相似度:80.00% 第2组(question vs answer)的位置匹配相似度:40.00%
简单解释下结果:
- 第一组的
"1f31f"和"1f31a",前4个字符完全匹配,第5个不同,5个位置里中4个,所以是80% - 第二组的
"1f32f"和"1fada",只有前2个字符匹配,5个位置里中2个,所以是40%
要是你需要基于较长字符串的长度计算(比如其中一个字符串更长,超出部分算不匹配),只需要把函数里的minLength换成Math.max(str1.length, str2.length)就可以了~
内容的提问来源于stack exchange,提问作者LeCoda




