Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/mattyork/fuzzy
Filters a list based on a fuzzy string search
https://github.com/mattyork/fuzzy
Last synced: 15 days ago
JSON representation
Filters a list based on a fuzzy string search
- Host: GitHub
- URL: https://github.com/mattyork/fuzzy
- Owner: mattyork
- License: mit
- Created: 2012-07-15T08:31:52.000Z (over 12 years ago)
- Default Branch: master
- Last Pushed: 2021-12-20T07:11:22.000Z (almost 3 years ago)
- Last Synced: 2024-05-15T20:52:13.507Z (6 months ago)
- Language: JavaScript
- Homepage:
- Size: 3.35 MB
- Stars: 827
- Watchers: 17
- Forks: 86
- Open Issues: 29
-
Metadata Files:
- Readme: README.md
- License: LICENSE-MIT
Awesome Lists containing this project
- awesome - fuzzy - Filters a list based on a fuzzy string search (JavaScript)
- awesome-tiny-js - fuzzy - Index-free, can highlight matches. <img align="top" height="24" src="./img/fuzzy.svg"> (Text Search / Fuzzy search)
README
# fuzzy [![Build Status](https://img.shields.io/travis/mattyork/fuzzy/master.svg)](https://travis-ci.org/mattyork/fuzzy) [![npm version](https://badge.fury.io/js/fuzzy.svg)](https://badge.fury.io/js/fuzzy)
1k standalone fuzzy search / fuzzy filter a la Sublime Text's command-p fuzzy file search. Works in both node and browser.
[![Example](http://i.imgur.com/obzCQq7.gif)](http://htmlpreview.github.io/?https://github.com/mattyork/fuzzy/blob/master/examples/disney.html)
Try it yourself: [Disney Character Search Example](http://htmlpreview.github.io/?https://github.com/mattyork/fuzzy/blob/master/examples/disney.html)
## Get it
Node:
```bash
$ npm install --save fuzzy
$ node
> var fuzzy = require('fuzzy');
> console.log(fuzzy)
{ test: [Function],
match: [Function],
filter: [Function] }
```Browser:
```html
console.log(fuzzy);
// Object >
// filter: function (pattern, arr, opts) {
// match: function (pattern, string, opts) {
// test: function (pattern, string) {```
## Use it
Padawan: Simply filter an array of strings.
```javascript
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);
// [ 'baconing', 'a mighty bear canoe' ]
```Jedi: Wrap matching characters in each string
```javascript
var list = ['baconing', 'narwhal', 'a mighty bear canoe'];
var options = { pre: '<', post: '>' };
var results = fuzzy.filter('bcn', list, options)
console.log(results);
// [
// {string: 'aoing' , index: 0, score: 3, original: 'baconing'},
// {string: 'a mighty ear aoe', index: 2, score: 3, original: 'a mighty bear canoe'}
// ]
```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```javascript
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);
// [ 'aoing', 'a mighty ear aoe' ]
```## Examples
Check out the html files in the [examples](https://github.com/mattyork/fuzzy/tree/master/examples) directory.Try the examples live:
- [disney](http://htmlpreview.github.io/?https://github.com/mattyork/fuzzy/blob/master/examples/disney.html)
- [wikipedia](http://htmlpreview.github.io/?https://github.com/mattyork/fuzzy/blob/master/examples/wikipedia.html)
## Documentation
[Code is well documented](https://github.com/mattyork/fuzzy/blob/master/lib/fuzzy.js) and the [unit tests](https://github.com/mattyork/fuzzy/blob/master/test/fuzzy.test.js) cover all functionality## Contributing
Fork the repo!git clone
cd fuzzy
npm install
makeAdd 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* Initial Release
v0.1.1 - September 19, 2015
* Fix broken links in package.json
* Fix examplesv0.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 #22v0.1.3 - October 1, 2016
* Fix blocking bug in React Native #27
## License
Copyright (c) 2015 Matt York
Licensed under the MIT license.## TODO
1. 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: `odciou bas`. 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 `active re`
2. Search feature: Work on multiple strings in a match. For example, be able
to match against 'stth' against an object { folder: 'stuff', file: 'thing' }
3. Async batch updates so the UI doesn't block for huge sets. Or maybe Web Workers?
4. Performance performance performance!