as-services/libs/utils/words-id/autocorrect/BKNodeLetters.js

49 lines
1.2 KiB
JavaScript

const levenshtein = require("fast-levenshtein")
module.exports = class BKNodeLetters {
constructor(word) {
this.word = word
this.children = new Map()
}
insert(otherWord) {
const dist = levenshtein.get(this.word, otherWord)
if (this.children.has(dist)) {
this.children.get(dist).insert(otherWord)
} else {
this.children.set(dist, new BKNodeLetters(otherWord))
}
}
search(target, maxDist) {
const currentDist = levenshtein.get(this.word, target)
// If the distance is within the acceptable maximum, return this word immediately
if (currentDist <= maxDist) {
return { word: this.word, distance: currentDist }
}
let minDistanceWord = null
for (
let i = Math.max(0, currentDist - maxDist);
i <= currentDist + maxDist;
i++
) {
if (this.children.has(i)) {
const result = this.children.get(i).search(target, maxDist)
if (
result &&
(!minDistanceWord || result.distance < minDistanceWord.distance)
) {
minDistanceWord = result
if (result.distance <= 1) {
// Early stop if very close match found
break
}
}
}
}
return minDistanceWord
}
}