Project

fzy

0.05
Low commit activity in last 3 years
A long-lived project that still receives updates
fzy is a fast fuzzy text selector with an advanced scoring algorithm
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
 Dependencies

Development

 Project Readme

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. See the full example below for a way to do this check.

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 includes `hasMatch` which can be used for filtering
list = list.filter((s) => fzy.hasMatch(s));

// 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