-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstring-similarity.js
38 lines (37 loc) · 1.39 KB
/
string-similarity.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/**
* Calculate similarity between two strings
* @param {string} str1 First string to match
* @param {string} str2 Second string to match
* @param {number} [substringLength=2] Optional. Length of substring to be used in calculating similarity. Default 2.
* @param {boolean} [caseSensitive=false] Optional. Whether you want to consider case in string matching. Default false;
* @returns Number between 0 and 1, with 0 being a low match score.
*/
var stringSimilarity = function (str1, str2, substringLength, caseSensitive) {
if (substringLength === void 0) {
substringLength = 2;
}
if (caseSensitive === void 0) {
caseSensitive = false;
}
if (!caseSensitive) {
str1 = str1.toLowerCase();
str2 = str2.toLowerCase();
}
if (str1.length < substringLength || str2.length < substringLength) return 0;
var map = new Map();
for (var i = 0; i < str1.length - (substringLength - 1); i++) {
var substr1 = str1.substr(i, substringLength);
map.set(substr1, map.has(substr1) ? map.get(substr1) + 1 : 1);
}
var match = 0;
for (var j = 0; j < str2.length - (substringLength - 1); j++) {
var substr2 = str2.substr(j, substringLength);
var count = map.has(substr2) ? map.get(substr2) : 0;
if (count > 0) {
map.set(substr2, count - 1);
match++;
}
}
return (match * 2) / (str1.length + str2.length - (substringLength - 1) * 2);
};
export { stringSimilarity };