UNPKG

3.02 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3function levenshtein(a, b) {
4 if (a.length === 0) {
5 return b.length;
6 }
7 if (b.length === 0) {
8 return a.length;
9 }
10 var matrix = [];
11 var i;
12 for (i = 0; i <= b.length; i++) {
13 matrix[i] = [i];
14 }
15 var j;
16 for (j = 0; j <= a.length; j++) {
17 matrix[0][j] = j;
18 }
19 for (i = 1; i <= b.length; i++) {
20 for (j = 1; j <= a.length; j++) {
21 if (b.charAt(i - 1) === a.charAt(j - 1)) {
22 matrix[i][j] = matrix[i - 1][j - 1];
23 }
24 else {
25 matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, Math.min(matrix[i][j - 1] + 1, matrix[i - 1][j] + 1));
26 }
27 }
28 }
29 return matrix[b.length][a.length];
30}
31exports.levenshtein = levenshtein;
32function newDistanceFn(str) {
33 return function (x, y) {
34 var xValue = str(x).trim();
35 var yValue = str(y).trim();
36 var lev = levenshtein(xValue, yValue);
37 return lev / (xValue.length + yValue.length);
38 };
39}
40exports.newDistanceFn = newDistanceFn;
41function newMatcherFn(distance) {
42 function findBestMatch(a, b, cache) {
43 if (cache === void 0) { cache = new Map(); }
44 var bestMatchDist = Infinity;
45 var bestMatch;
46 for (var i = 0; i < a.length; ++i) {
47 for (var j = 0; j < b.length; ++j) {
48 var cacheKey = JSON.stringify([a[i], b[j]]);
49 var md = void 0;
50 if (!(cache.has(cacheKey) && (md = cache.get(cacheKey)))) {
51 md = distance(a[i], b[j]);
52 cache.set(cacheKey, md);
53 }
54 if (md < bestMatchDist) {
55 bestMatchDist = md;
56 bestMatch = { indexA: i, indexB: j, score: bestMatchDist };
57 }
58 }
59 }
60 return bestMatch;
61 }
62 function group(a, b, level, cache) {
63 if (level === void 0) { level = 0; }
64 if (cache === void 0) { cache = new Map(); }
65 var bm = findBestMatch(a, b, cache);
66 if (!bm || a.length + b.length < 3) {
67 return [[a, b]];
68 }
69 var a1 = a.slice(0, bm.indexA);
70 var b1 = b.slice(0, bm.indexB);
71 var aMatch = [a[bm.indexA]];
72 var bMatch = [b[bm.indexB]];
73 var tailA = bm.indexA + 1;
74 var tailB = bm.indexB + 1;
75 var a2 = a.slice(tailA);
76 var b2 = b.slice(tailB);
77 var group1 = group(a1, b1, level + 1, cache);
78 var groupMatch = group(aMatch, bMatch, level + 1, cache);
79 var group2 = group(a2, b2, level + 1, cache);
80 var result = groupMatch;
81 if (bm.indexA > 0 || bm.indexB > 0) {
82 result = group1.concat(result);
83 }
84 if (a.length > tailA || b.length > tailB) {
85 result = result.concat(group2);
86 }
87 return result;
88 }
89 return group;
90}
91exports.newMatcherFn = newMatcherFn;
92//# sourceMappingURL=rematch.js.map
\No newline at end of file