UNPKG

string-metric

Version:

Get string similarity in JavaScript or TypeScript

69 lines (68 loc) 2.26 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Damerau = void 0; var utils_1 = require("./utils/utils"); var Damerau = /** @class */ (function () { function Damerau() { } Damerau.prototype.distance = function (s1, s2) { if (utils_1.isNullOrUndefined(s1)) { throw new Error('s1 must neither be null nor undefined'); } if (utils_1.isNullOrUndefined(s2)) { throw new Error('s2 must neither be null nor undefined'); } if (s1 === s2) { return 0; } var inf = s1.length + s2.length; var da = new Map(); for (var d = 0; d < s1.length; d++) { da.set(s1[d], 0); } for (var d = 0; d < s2.length; d++) { da.set(s2[d], 0); } var h = utils_1.createTwoDimensionalArray(s1.length + 2, s2.length + 2); for (var i = 0; i <= s1.length; i++) { h[i + 1][0] = inf; h[i + 1][1] = i; } for (var j = 0; j <= s2.length; j++) { h[0][j + 1] = inf; h[1][j + 1] = j; } for (var i = 1; i <= s1.length; i++) { var db = 0; for (var j = 1; j <= s2.length; j++) { var i1 = da.get(s2[j - 1]); var j1 = db; var cost = 1; if (s1[i - 1] === s2[j - 1]) { cost = 0; db = j; } h[i + 1][j + 1] = this.min(h[i][j] + cost, h[i + 1][j] + 1, h[i][j + 1] + 1, h[i1][j1] + (i - i1 - 1) + 1 + (j - j1 - 1)); } da.set(s1[i - 1], i); } return h[s1.length + 1][s2.length + 1]; }; Damerau.prototype.min = function (a, b, c, d) { return this.minWithNaN(a, this.minWithNaN(b, this.minWithNaN(c, d))); }; Damerau.prototype.minWithNaN = function (a, b) { if (isNaN(a) && isNaN(b)) { return 0; } if (isNaN(a)) { return b; } if (isNaN(b)) { return a; } return Math.min(a, b); }; return Damerau; }()); exports.Damerau = Damerau;