string-metric
Version:
Get string similarity in JavaScript or TypeScript
69 lines (68 loc) • 2.26 kB
JavaScript
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;
;