// Similarity between to string from 0 to 100 function similarity(s1, s2) { const distance = levenshtein(s1.toLowerCase(), s2.toLowerCase()); const maxLength = Math.max(s1.length, s2.length); if (maxLength === 0) return 100; const similarity = (1 - distance / maxLength) * 100; return similarity.toFixed(2); } function levenshtein(s1, s2) { if (s1 === s2) { return 0; } var n = s1.length, m = s2.length; if (n === 0 || m === 0) { return n + m; } var x = 0, y, a, b, c, d, g, h, k; var p = new Array(n); for (y = 0; y < n;) { p[y] = ++y; } for (; (x + 3) < m; x += 4) { var e1 = s2.charCodeAt(x); var e2 = s2.charCodeAt(x + 1); var e3 = s2.charCodeAt(x + 2); var e4 = s2.charCodeAt(x + 3); c = x; b = x + 1; d = x + 2; g = x + 3; h = x + 4; for (y = 0; y < n; y++) { k = s1.charCodeAt(y); a = p[y]; if (a < c || b < c) { c = (a > b ? b + 1 : a + 1); } else { if (e1 !== k) { c++; } } if (c < b || d < b) { b = (c > d ? d + 1 : c + 1); } else { if (e2 !== k) { b++; } } if (b < d || g < d) { d = (b > g ? g + 1 : b + 1); } else { if (e3 !== k) { d++; } } if (d < g || h < g) { g = (d > h ? h + 1 : d + 1); } else { if (e4 !== k) { g++; } } p[y] = h = g; g = d; d = b; b = c; c = a; } } for (; x < m;) { var e = s2.charCodeAt(x); c = x; d = ++x; for (y = 0; y < n; y++) { a = p[y]; if (a < c || d < c) { d = (a > d ? d + 1 : a + 1); } else { if (e !== s1.charCodeAt(y)) { d = c + 1; } else { d = c; } } p[y] = d; c = a; } h = d; } return h; }