levenshtein.js 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. var vector = [];
  2. var bChars = [];
  3. exports = function(a, b) {
  4. if (a === b) return 0;
  5. if (a.length > b.length) {
  6. var tmp = a;
  7. a = b;
  8. b = tmp;
  9. }
  10. var aLen = a.length;
  11. var bLen = b.length;
  12. if (!aLen) return bLen;
  13. if (!bLen) return aLen;
  14. while (aLen > 0 && a.charCodeAt(aLen - 1) === b.charCodeAt(bLen - 1)) {
  15. aLen--;
  16. bLen--;
  17. }
  18. if (!aLen) return bLen;
  19. var start = 0;
  20. while (start < aLen && a.charCodeAt(start) === b.charCodeAt(start)) {
  21. start++;
  22. }
  23. aLen -= start;
  24. bLen -= start;
  25. if (!aLen) return bLen;
  26. var current = 0;
  27. var left;
  28. var above;
  29. var charA;
  30. var i = 0;
  31. while (i < bLen) {
  32. bChars[i] = b.charCodeAt(start + i);
  33. vector[i] = ++i;
  34. }
  35. for (var _i = 0; _i < aLen; _i++) {
  36. left = _i;
  37. current = _i + 1;
  38. charA = a.charCodeAt(start + _i);
  39. for (var j = 0; j < bLen; j++) {
  40. above = current;
  41. current = left;
  42. left = vector[j];
  43. if (charA !== bChars[j]) {
  44. if (left < current) current = left;
  45. if (above < current) current = above;
  46. current++;
  47. }
  48. vector[j] = current;
  49. }
  50. }
  51. return current;
  52. };
  53. module.exports = exports;