1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | function 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 | }
|
31 | exports.levenshtein = levenshtein;
|
32 | function 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 | }
|
40 | exports.newDistanceFn = newDistanceFn;
|
41 | function 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 | }
|
91 | exports.newMatcherFn = newMatcherFn;
|
92 |
|
\ | No newline at end of file |