Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function min (d0, d1, d2, bx, ay) {
- return d0 < d1 || d2 < d1 ? d0 > d2 ? d2 + 1 : d0 + 1 : bx === ay ? d1 : d1 + 1
- }
- function levenshtein (a, b) {
- if (a === b) return 0
- if (a.length > b.length) {
- var tmp = a
- a = b
- b = tmp
- }
- var la = a.length
- var lb = b.length
- while (la > 0 && (a.charCodeAt(la - 1) === b.charCodeAt(lb - 1))) {
- la--
- lb--
- }
- var offset = 0
- while (offset < la && (a.charCodeAt(offset) === b.charCodeAt(offset))) {
- offset++
- }
- la -= offset
- lb -= offset
- if (la === 0 || lb < 3) return lb
- var x = 0
- var vector = []
- for (var y = 0; y < la; y++) {
- vector.push(y + 1)
- vector.push(a.charCodeAt(offset + y))
- }
- for (; (x + 3) < lb;) {
- var bx0 = b.charCodeAt(offset + (d0 = x))
- var bx1 = b.charCodeAt(offset + (d1 = x + 1))
- var bx2 = b.charCodeAt(offset + (d2 = x + 2))
- var bx3 = b.charCodeAt(offset + (d3 = x + 3))
- var dd = (x += 4)
- for (y = 0; y < vector.length; y += 2) {
- var dy = vector[y]
- var ay = vector[y + 1]
- var d0 = min(dy, d0, d1, bx0, ay)
- var d1 = min(d0, d1, d2, bx1, ay)
- var d2 = min(d1, d2, d3, bx2, ay)
- dd = min(d2, d0, dd, bx3, ay)
- vector[y] = dd
- var d3 = d2
- d2 = d1
- d1 = d0
- d0 = dy
- }
- }
- for (; x < lb;) {
- bx0 = b.charCodeAt(offset + (d0 = x))
- dd = ++x
- for (y = 0; y < vector.length; y += 2) {
- dy = vector[y]
- vector[y] = dd = dy < d0 || dd < d0 ? dy > dd ? dd + 1 : dy + 1 : bx0 === vector[y + 1] ? d0 : d0 + 1
- d0 = dy
- }
- }
- return dd
- }
- function getClosest (item, array) {
- var closest
- var diff
- if (!Array.isArray(array)) throw new TypeError('Second argument must be array')
- array.forEach(function (comparedItem, comparedItemIndex) {
- var thisDiff = levenshtein(comparedItem, item)
- if (thisDiff >= 0 && (typeof diff === 'undefined' || thisDiff < diff)) {
- diff = thisDiff
- closest = comparedItem
- }
- })
- return closest
- }
Add Comment
Please, Sign In to add comment