UNPKG

string-metric

Version:

Get string similarity in JavaScript or TypeScript

77 lines (76 loc) 2.61 kB
"use strict"; 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;