cockatoo.js
Version:
Fuzzy search library based based on Damerau Levenshtein distance algorithm for Node.js
57 lines (56 loc) • 2.08 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var DamerauLevenshtein = /** @class */ (function () {
function DamerauLevenshtein() {
this.deletionCost = 1;
this.insertionCost = 1;
this.substitutionCost = 1;
this.transpositionCost = 1;
}
DamerauLevenshtein.prototype.getDistance = function (s1, s2) {
if (undefined == s1 || undefined == s2 || 'string' !== typeof s1
|| 'string' !== typeof s2 || s1.length === 0 || s2.length === 0) {
return -1;
}
var s1Length = s1.length;
var s2Length = s2.length;
var d = this.initMatrix(s1Length, s2Length);
if (d === null) {
return -1;
}
for (var i = 1; i <= s1Length; i++) {
var costSubst = void 0;
var costTrans = void 0;
for (var j = 1; j <= s2Length; j++) {
if (s1.charAt(i - 1) === s2.charAt(j - 1)) {
costSubst = 0;
costTrans = 0;
}
else {
costSubst = this.substitutionCost;
costTrans = this.transpositionCost;
}
d[i][j] = Math.min(d[i - 1][j] + this.deletionCost, // deletion
d[i][j - 1] + this.insertionCost, // insertion
d[i - 1][j - 1] + costSubst);
if (i > 1 && j > 1 && s1.charAt(i - 1) === s2.charAt(j - 2) && s1.charAt(i - 2) === s2.charAt(j - 1)) {
d[i][j] = Math.min(d[i][j], d[i - 2][j - 2] + costTrans);
}
}
}
return d[s1Length][s2Length];
};
DamerauLevenshtein.prototype.initMatrix = function (s1Length, s2Length) {
var d = [];
for (var i = 0; i <= s1Length; i++) {
d[i] = [];
d[i][0] = i;
}
for (var j = 0; j <= s2Length; j++) {
d[0][j] = j;
}
return d;
};
return DamerauLevenshtein;
}());
exports.DamerauLevenshtein = DamerauLevenshtein;