fuzzy-match-utils
Version:
A collection of string matching algorithms built with React Select in mind
1 lines • 1.47 kB
JavaScript
Object.defineProperty(exports,"__esModule",{value:true});exports.filterOptions=filterOptions;exports.typeaheadSimilarity=typeaheadSimilarity;exports.fullStringDistance=fullStringDistance;exports.cleanUpText=cleanUpText;function filterOptions(r,e,t){if(!e){return r}var n=cleanUpText(e,t);return r.filter(function(r){var e=r.label,t=r.value;return e!=null&&t!=null}).map(function(r){return{option:r,score:typeaheadSimilarity(cleanUpText(r.label,t),n)}}).filter(function(r){return r.score>=n.length-2}).sort(function(r,e){return e.score-r.score}).map(function(r){return r.option})}function typeaheadSimilarity(r,e){var t=r.length;var n=e.length;var a=[];if(!t||!n){return 0}if(t<n){var i=[e,r];r=i[0];e=i[1]}if(r.indexOf(e)!==-1){return n+1/t}for(var u=0;u<=t;++u){a[u]=[0]}for(var l=0;l<=n;++l){a[0][l]=0}for(var o=1;o<=t;++o){for(var f=1;f<=n;++f){a[o][f]=r[o-1]===e[f-1]?1+a[o-1][f-1]:Math.max(a[o][f-1],a[o-1][f])}}return a[t][n]}function fullStringDistance(r,e){var t=r.length;var n=e.length;var a=[];if(!t){return n}if(!n){return t}for(var i=0;i<=t;++i){a[i]=[i]}for(var u=0;u<=n;++u){a[0][u]=u}for(var l=1;l<=t;++l){for(var o=1;o<=n;++o){a[l][o]=r[l-1]===e[o-1]?a[l-1][o-1]:1+Math.min(a[l-1][o],a[l][o-1],a[l-1][o-1])}}return a[t][n]}function cleanUpText(r,e){if(!r){return""}r=r.toUpperCase().replace(/((?=[^\u00E0-\u00FC])\W)|_/g,"");if(!e){return r}var t=e;return Object.keys(t).reduce(function(r,e){var n=new RegExp(e,"g");return r.replace(n,t[e])},r)}
;