diff --git a/src/core/lib/Levenshtein.mjs b/src/core/lib/Levenshtein.mjs index 9cc209be..6fa5c76f 100644 --- a/src/core/lib/Levenshtein.mjs +++ b/src/core/lib/Levenshtein.mjs @@ -24,29 +24,30 @@ export function levenshteinDistance(firstString, secString) { if (!secStringLength) return firstStringLength; - const distanceMatrix = Array(secStringLength + 1).fill(0).map(() => Array(firstStringLength + 1).fill(0)); + const distMatrix = Array(secStringLength + 1).fill(0).map(() => Array(firstStringLength + 1).fill(0)); // Fill in first row distances. - for (let i = 0; i <= firstStringLength; i++) - distanceMatrix[0][i] = i; + let i; + for (i = 0; i < firstStringLength + 1; i++) + distMatrix[0][i] = i; // Fill in column distances. - for (let i = 0; i <= secStringLength; i++) - distanceMatrix[i][0] = i; + for (i = 0; i < secStringLength + 1; i++) + distMatrix[i][0] = i; // Propogate the values through the matrix, the leading diagonal holds the total difference at any point. - for (let j = 1; j <= secStringLength; j++) { - for (let i = 1; i <= firstStringLength; i++) { - const indicator = firstString[i - 1] === secString[j - 1] ? 0 : 1; - distanceMatrix[j][i] = Math.min( - distanceMatrix[j][i - 1] + 1, // Deletion - distanceMatrix[j - 1][i] + 1, // Insertion - distanceMatrix[j - 1][i - 1] + indicator, // Substitution + for (i = 1; i < secStringLength + 1; i++) { + for (let j = 1; j < firstStringLength + 1; j++) { + const indicator = firstString[j - 1] === secString[i - 1] ? 0 : 1; + distMatrix[i][j] = Math.min( + distMatrix[i][j - 1] + 1, // Deletion + distMatrix[i - 1][j] + 1, // Insertion + distMatrix[i - 1][j - 1] + indicator, // Substitution ); } } - return distanceMatrix[secStringLength][firstStringLength]; + return distMatrix[secStringLength][firstStringLength]; } export default levenshteinDistance;