Created
March 20, 2019 18:15
-
-
Save dually8/f1ddb657c78c40597e82be8d3af64590 to your computer and use it in GitHub Desktop.
Fuzzy Search JS
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function myFuzzySearch(needle, haystack) { | |
if (!needle || typeof needle !== 'string' | |
|| !haystack || typeof haystack !== 'string') { | |
return false; | |
} | |
var innerRegex = needle | |
.trim() | |
.split('') | |
.filter(x => /\S/i.exec(x)) | |
.map(x => { | |
if (/\W/.exec(x)) { | |
return `(\\${x})`; | |
} | |
return `(${x})` | |
}) | |
.join('(.+)?'); | |
var regex = new RegExp(`(.+)?${innerRegex}(.+)?`, 'i'); | |
return regex.test(haystack); | |
} | |
var files = [ | |
'rhoncus dui vel.png', | |
'magna at nunc.mpeg', | |
'quis tortor id.xls', | |
'nonummy.mov', | |
'a feugiat et.avi', | |
'ac enim in.mp3', | |
'congue elementum.xls', | |
'odio donec vitae.avi', | |
'non mi.mpeg', | |
'vivamus in.xls', | |
'phasellus in.ppt', | |
'venenatis lacinia aenean.mpeg', | |
'aliquam.gif', | |
'in consequat.avi', | |
'id ligula suspendisse.mp3', | |
'cubilia curae donec.xls', | |
'in sagittis dui.mp3', | |
'aenean.mp3', | |
'sed.tiff', | |
'dis parturient montes.jpeg', | |
'cubilia.xls', | |
'ultrices.jpeg', | |
'erat quisque erat.mpeg', | |
'dis parturient.xls', | |
'ultrices.avi', | |
'quis orci.tiff', | |
'donec posuere metus.avi', | |
'quis tortor id.ppt', | |
'auctor.avi', | |
'nec nisi vulputate.txt', | |
'sapien placerat.xls', | |
'quis justo maecenas.avi', | |
'habitasse platea dictumst.avi', | |
'magna at nunc.avi', | |
'blandit nam.xls', | |
'in sapien.tiff', | |
'odio.jpeg', | |
'convallis.ppt', | |
'semper.tiff', | |
'ut.tiff', | |
'blandit.doc', | |
'quam.tiff', | |
'ut erat curabitur.avi', | |
'lacus.mp3', | |
'at ipsum ac.jpeg', | |
'ut rhoncus.xls', | |
'posuere.avi', | |
'integer.ppt', | |
'dictumst maecenas.tiff', | |
'adipiscing.xls', | |
'eros viverra.avi', | |
'sollicitudin vitae consectetuer.mpeg', | |
'id.mp3', | |
'mattis odio donec.ppt', | |
'sit.ppt', | |
'pede posuere.mp3', | |
'augue luctus tincidunt.doc', | |
'lorem id ligula.ppt', | |
'ligula sit.avi', | |
'vivamus in felis.jpeg', | |
'aliquam convallis.ppt', | |
'consequat.doc', | |
'est phasellus.avi', | |
'erat volutpat in.mp3', | |
'mattis pulvinar nulla.ppt', | |
'curae.doc', | |
'etiam vel.xls', | |
'luctus.mp3', | |
'maecenas leo odio.avi', | |
'curabitur in.avi', | |
'sit amet.txt', | |
'nisi.gif', | |
'rhoncus aliquet pulvinar.mp3', | |
'pellentesque.mov', | |
'et magnis dis.avi', | |
'volutpat convallis.xls', | |
'lacus at turpis.xls', | |
'luctus.xls', | |
'magnis.mp3', | |
'morbi.xls', | |
'aenean fermentum.avi', | |
'nulla sed vel.doc', | |
'curabitur.ppt', | |
'tortor quis turpis.mp3', | |
'massa donec dapibus.xls', | |
'purus.xls', | |
'nulla suspendisse potenti.xls', | |
'vehicula.ppt', | |
'platea dictumst.ppt', | |
'dui maecenas tristique.jpeg', | |
'eleifend donec.pdf', | |
'integer pede justo.mov', | |
'fusce consequat.png', | |
'pellentesque ultrices phasellus.ppt', | |
'lobortis sapien.pdf', | |
'mi pede.mp3', | |
'vitae nisl.mp3', | |
'sit amet.png', | |
'in magna.jpeg', | |
'lacinia nisi.tiff', | |
'/application/blog/views', | |
]; | |
var searchStr = 'mag.jpg'; | |
console.time('searchTime'); | |
var filesFiltered = files.filter(x => myFuzzySearch(searchStr, x)); | |
console.log(filesFiltered); | |
console.log(`Files length: ${files.length}, filtered length: ${filesFiltered.length}`); | |
console.timeEnd('searchTime'); | |
// Output Example: | |
// [ 'in magna.jpeg' ] | |
// Files length: 101, filtered length: 1 | |
// searchTime: 2.680ms |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment