Skip to content

rgehan/fuzzyfinder

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

34 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Fuzzyfinder allows to search a dataset with partial input. It also handles the highlighting of the matches.

It is similar to the file search feature of Sublime Text or Atom.

There is an example react app demonstrating the module.

Installation

$ npm install fuzzyfinder # or yarn add fuzzyfinder

Usage

// Import the module
import fuzzyfinder from 'fuzzyfinder';

// Create an instance
const ff = new fuzzyfinder('<b>', '</b>');

// Test data
const data = [
  'absolute', 'absolutely', 'absorb', 'abuse', 'academic', 'accept',
  'access', 'accident', 'accompany', 'accomplish', 'according',
  'account', 'accurate', 'accuse', 'achieve', 'achievement',
  // ...
];

// Perform a search
let results = ff.search('abs', data);

/*
 * Output:
 * [{
 *   score: 123,
 *   text: '<b>a</b><b>b</b><b>s</b>olute'
 * }, {
 *   score: 123,
 *   text: '<b>a</b><b>b</b><b>s</b>olutely'
 * }, {
 *   ...
 * }]
 */

API

Methods configuration

A configuration object can be passed to both search and match methods. Here is the default one:

{
  highlight: false, // Generate the highlighted subject ?
  outputFull: false, // Output the whole subject ?
  getter: obj => obj, // The getter method allowing to extract the string from the subject
}

{ highlight: true, ... }

Enables the highlighting on the output. Only the text field will be highlighted, the subject object, if passed, will be returned unaltered.

{ outputFull: true, getter: obj => obj.name, ... }

If outputFull is set to true, output the matched subject too.

If the search subject isn't an array of string, but for example [{ product: 'Banana', price: 1.23 }, { product: 'Meat', price: 10.67 }], you will have to provide a getter function. This function allow the engine to extract the right string for each of the objects of the array.

For example:

let data = [{ product: 'Banana', price: 1.23 }, { product: 'Meat', price: 10.67 }];

ff.search('baaa', data, {
  outputFull: true,
  getter: obj => obj.product,
});

/* Outputs:
 * [{
 *   score: 123,
 *   text: 'Banana',
 *   subject: {
 *     product: 'Banana',
 *     price: 1.23
 *   }
 * }]
 */

 ff.search('baaa', data, {
   outputFull: false,
   getter: obj => obj.product,
 });

 /* Outputs:
  * [{
  *   score: 123,
  *   text: 'Banana'
  * }]
  */

Performing a search on a list of values

search(string needle, array haystack [, options = {}])

It is probably the most useful method of the class, it searches the dataset and return the matches.

haystack can be an array of string, or an array of objects. If it is an array of objects, the getter method has to be set to allow the engine to know on what field of the object to search.

Finding out whether a string matches another

match(string search, string subject [, options = {}])

It is the method used by search. It returns false if there is no match, or a match object if there is a match.

ff.match('foo', 'foobar'); // -> { text: 'foobar', score: 123 }
ff.match('baz', 'foobar'); // -> false
ff.match('foo', 'foobar', { highlight: true }); // -> { text: '<f><o><o>bar', score: 123 }
ff.match('baz', 'foobar', { highlight: true }); // -> false

Setting the opening/closing tags

constructor(string openTag = '<b>', string closeTag = '</b>')
ff.setOpenTag(string tag)
ff.setCloseTag(string tag)

The tags can be set at the moment the finder is instantiated or after that with the two setters.

About

Tiny fuzzyfinder with highlighting of the search results

Resources

Stars

Watchers

Forks

Packages

No packages published