string-metric
Version:
Get string similarity in JavaScript or TypeScript
77 lines (76 loc) • 2.61 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.WeightedLevenshtein = void 0;
var utils_1 = require("./utils/utils");
var WeightedLevenshtein = /** @class */ (function () {
function WeightedLevenshtein(charsub, charchange) {
this.charsub = charsub;
this.charchange = charchange;
}
WeightedLevenshtein.prototype.distance = function (s1, s2, limit) {
if (limit === void 0) { limit = Number.MAX_VALUE; }
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;
}
if (s1.length === 0) {
return s2.length;
}
if (s2.length === 0) {
return s1.length;
}
var v0 = Array(s2.length + 1);
var v1 = Array(s2.length + 1);
var vtemp = [];
v0[0] = 0;
for (var i = 1; i < v0.length; i++) {
v0[i] = v0[i - 1] + this.insertionCost(s2[i - 1]);
}
for (var i = 0; i < s1.length; i++) {
var s1i = s1[i];
var deletionCost = this.deletionCost(s1i);
v1[0] = v0[0] + deletionCost;
var minv1 = v1[0];
for (var j = 0; j < s2.length; j++) {
var s2j = s2[j];
var cost = 0;
if (s1i !== s2j) {
cost = this.charsub.cost(s1i, s2j);
}
var insertionCost = this.insertionCost(s2j);
v1[j + 1] = Math.min(v1[j] + insertionCost, Math.min(v0[j + 1] + deletionCost, v0[j] + cost));
minv1 = Math.min(minv1, v1[j + 1]);
}
if (minv1 >= limit) {
return limit;
}
vtemp = v0;
v0 = v1;
v1 = vtemp;
}
return v0[s2.length];
};
WeightedLevenshtein.prototype.insertionCost = function (c) {
if (this.charchange) {
return this.charchange.insertionCost(c);
}
else {
return 1;
}
};
WeightedLevenshtein.prototype.deletionCost = function (c) {
if (this.charchange) {
return this.charchange.deletionCost(c);
}
else {
return 1;
}
};
return WeightedLevenshtein;
}());
exports.WeightedLevenshtein = WeightedLevenshtein;
;