fzy.js

0.4.1 • Public • Published

fzy.js

A javascript port of fzy's fuzzy finder scoring algorithm

Try it out online!

CI status Build Size 0 Dependencies

Installation

npm i --save fzy.js

Usage

score(needle, haystack)

var fzy = require('fzy.js')

fzy.score("amuser", "app/models/user.rb")     // 5.595
fzy.score("amuser", "app/models/customer.rb") // 3.655

positions(needle, haystack)

fzy.positions("amuser", "app/models/user.rb")     // [ 0, 4, 11, 12, 13, 14 ]
fzy.positions("amuser", "app/models/customer.rb") // [ 0, 4, 12, 13, 17, 18 ]

NB: score and positions must be called with matching needle and haystack, doing otherwise is undefined. The caller needs to check that there is a match.

Full Example

var { sortBy, escapeRegExp } = require("lodash");
var fzy = require("fzy.js");

// List of candidate strings
// Often generated by something like require("glob")("**/*")
var list = [
	"app/models/user.rb",
	"app/models/order.rb",
	"app/models/customer.rb"
];

// Usually this is input from the user
var query = "amuser";

// fzy.js doesn't implement filtering, only scoring, but it is simple enough with a regexp
var regex = new RegExp(query.split('').map(escapeRegExp).join(".*"));
list = list.filter((s) => s.match(regex));

// Sort by fzy's scoring, descending (higher scores are better matches)
list = sortBy(list, (s) => -fzy.score(query, s));

// Select only the first 10 results
list.slice(0, 10);

// Print out our results with matched positions
list.forEach((s) => {
	var padded = "";
	var p = fzy.positions(query, s);
	for(var i = 0; i < query.length; i++) {
		padded = padded.padEnd(p[i], ' ') + query[i];
	}

	console.log(s);
	console.log(padded);
	console.log("");
});

// Output:
//
// app/models/user.rb
// a   m      user
//
// app/models/customer.rb
// a   m       us   er

Readme

Keywords

none

Package Sidebar

Install

npm i fzy.js

Weekly Downloads

16,287

Version

0.4.1

License

MIT

Unpacked Size

13.3 kB

Total Files

5

Last publish

Collaborators

  • jhawthorn