var makeString = require('./helper/makeString'); /** * Based on the implementation here: https://github.com/hiddentao/fast-levenshtein */ module.exports = function levenshtein(str1, str2) { 'use strict'; str1 = makeString(str1); str2 = makeString(str2); // Short cut cases if (str1 === str2) return 0; if (!str1 || !str2) return Math.max(str1.length, str2.length); // two rows var prevRow = new Array(str2.length + 1); // initialise previous row for (var i = 0; i < prevRow.length; ++i) { prevRow[i] = i; } // calculate current row distance from previous row for (i = 0; i < str1.length; ++i) { var nextCol = i + 1; for (var j = 0; j < str2.length; ++j) { var curCol = nextCol; // substution nextCol = prevRow[j] + ( (str1.charAt(i) === str2.charAt(j)) ? 0 : 1 ); // insertion var tmp = curCol + 1; if (nextCol > tmp) { nextCol = tmp; } // deletion tmp = prevRow[j + 1] + 1; if (nextCol > tmp) { nextCol = tmp; } // copy current col value into previous (in preparation for next iteration) prevRow[j] = curCol; } // copy last col value into previous (in preparation for next iteration) prevRow[j] = nextCol; } return nextCol; };