all files / src/autoComplete/ filters.js

18.18% Statements 6/33
0% Branches 0/14
0% Functions 0/7
20% Lines 6/30
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 561×                                       1×   1×       1×       1×                       1×                          
export const levenshteinDistance = (searchText, key) => {
  const current = []
  let prev
  let value
 
  for (let i = 0; i <= key.length; i++) {
    for (let j = 0; j <= searchText.length; j++) {
      if (i && j) {
        if (searchText.charAt(j - 1) === key.charAt(i - 1)) value = prev
        else value = Math.min(current[j], current[j - 1], prev) + 1
      } else {
        value = i + j
      }
      prev = current[j]
      current[j] = value
    }
  }
  return current.pop()
}
 
export const noFilter = () => true
 
export const caseSensitiveFilter = (searchText, key) => {
  return searchText !== '' && key.indexOf(searchText) !== -1
}
 
export const caseInsensitiveFilter = (searchText, key) => {
  return key.toLowerCase().indexOf(searchText.toLowerCase()) !== -1
}
 
export const levenshteinDistanceFilter = (distanceLessThan) => {
  if (distanceLessThan === undefined) {
    return levenshteinDistance
  } else if (typeof distanceLessThan !== 'number') {
    /*eslint-disable*/
    throw 'Error: levenshteinDistanceFilter is a filter generator, not a filter!'
    /*eslint-enable*/
  }
 
  return (s, k) => levenshteinDistance(s, k) < distanceLessThan
}
 
export const fuzzyFilter = (searchText, key) => {
  const compareString = key.toLowerCase()
  searchText = searchText.toLowerCase()
 
  let searchTextIndex = 0
  for (let index = 0; index < key.length; index++) {
    if (compareString[index] === searchText[searchTextIndex]) {
      searchTextIndex += 1
    }
  }
 
  return searchTextIndex === searchText.length
}