What is fuzzy?
The fuzzy npm package is used for implementing fuzzy searching. This means it can match partial strings to a list of strings and return the best matches. It is useful for features like autocomplete or filtering a list based on user input.
What are fuzzy's main functionalities?
Simple fuzzy matching
This feature allows you to perform a simple fuzzy search on an array of strings. It will return an array of matches with their original strings and score of the match.
const fuzzy = require('fuzzy');
const results = fuzzy.filter('twl', ['apple', 'banana', 'kiwi', 'tower']);
console.log(results.map(el => el.string));
Customizing the search
This feature allows you to customize the search with options such as pre and post to highlight the matched substring and extract to specify which property of the objects to search against.
const fuzzy = require('fuzzy');
const options = { pre: '<', post: '>', extract: el => el.title };
const results = fuzzy.filter('twl', [{title: 'apple'}, {title: 'banana'}, {title: 'tower'}], options);
console.log(results.map(el => el.string));
Other packages similar to fuzzy
fuse.js
Fuse.js is a powerful, lightweight fuzzy-search library with a rich set of options. It is more feature-rich and configurable than fuzzy, providing options like tokenization, match all tokens, threshold, and distance.
fuzzysort
Fuzzysort is a fast SublimeText-like fuzzy search for JavaScript. It focuses on performance and offers features like caching and pre-scoring. It is a good alternative to fuzzy when performance is a critical factor.
fuzzysearch
Fuzzysearch is a tiny and blazing-fast fuzzy search function that is easy to use and has no dependencies. It is less feature-rich compared to fuzzy but is suitable for simple use cases where size and speed are paramount.
fuzzy
1k standalone fuzzy search / fuzzy filter a la Sublime Text's command-p fuzzy file search. Works in both node and browser.
Try it yourself: Disney Character Search Example
Get it
Node:
$ npm install --save fuzzy
$ node
> var fuzzy = require('fuzzy');
> console.log(fuzzy)
{ test: [Function],
match: [Function],
filter: [Function] }
Browser:
<script src="/path/to/fuzzy.js"></script>
<script>
console.log(fuzzy);
</script>
Use it
Padawan: Simply filter an array of strings.
var list = ['baconing', 'narwhal', 'a mighty bear canoe'];
var results = fuzzy.filter('bcn', list)
var matches = results.map(function(el) { return el.string; });
console.log(matches);
Jedi: Wrap matching characters in each string
var list = ['baconing', 'narwhal', 'a mighty bear canoe'];
var options = { pre: '<', post: '>' };
var results = fuzzy.filter('bcn', list, options)
console.log(results);
Jedi Master: sometimes the array you give is not an array of strings. You can
pass in a function that creates the string to match against from each element
in the given array
var list = [
{rompalu: 'baconing', zibbity: 'simba'}
, {rompalu: 'narwhal' , zibbity: 'mufasa'}
, {rompalu: 'a mighty bear canoe', zibbity: 'saddam hussein'}
];
var options = {
pre: '<'
, post: '>'
, extract: function(el) { return el.rompalu; }
};
var results = fuzzy.filter('bcn', list, options);
var matches = results.map(function(el) { return el.string; });
console.log(matches);
Examples
Check out the html files in the examples directory.
Try the examples live:
Documentation
Code is well documented and the unit tests cover all functionality
Contributing
Fork the repo!
git clone <your_fork>
cd fuzzy
npm install
make
Add unit tests for any new or changed functionality. Lint, test, and minify using make, then shoot me a pull request.
Release History
v0.1.0 - July 25, 2012
v0.1.1 - September 19, 2015
- Fix broken links in package.json
- Fix examples
v0.1.2 - September 25, 2016
- Exact matches get the highest score. #15
- Add TypeScript typings #21
- Better error handling for invalid input #13
- Smaller bower install footprint #22
v0.1.3 - October 1, 2016
- Fix blocking bug in React Native #27
License
Copyright (c) 2015 Matt York
Licensed under the MIT license.
TODO
- Search improvement: behave a bit more like sublime text by getting
the BEST match in a given string, not just the first. For example,
searching for 'bass' in 'bodacious bass' should match against 'bass',
but it currently matches like so:
<b>od<a>ciou<s> ba<s>s
. There is
a test already written, just need to implement it. Naive O(n^2) worst
case: find every match in the string, then select the highest scoring
match. Should benchmark this against current implementation once implemented
Also, "reactive rice" would be <r><e>active r<i><c>e
- Search feature: Work on multiple strings in a match. For example, be able
to match against 'stth' against an object { folder: 'stuff', file: 'thing' }
- Async batch updates so the UI doesn't block for huge sets. Or maybe Web Workers?
- Performance performance performance!