Skip to content

Instantly share code, notes, and snippets.

@dually8
Created March 20, 2019 18:15
Show Gist options
  • Save dually8/f1ddb657c78c40597e82be8d3af64590 to your computer and use it in GitHub Desktop.
Save dually8/f1ddb657c78c40597e82be8d3af64590 to your computer and use it in GitHub Desktop.
Fuzzy Search JS
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