fuzzysearch-regex (v2)

Revision 2 of this benchmark created by @dfkaye on


Description

added string.replace(pattern, replacerFunction) test

Setup

var cases = [
      ['aaaaaaa', 'ffa aaa aa ultra'],
      ['aaaaaaaa', 'ffa aaa aa ultra'],
      ['aaaaaalt', 'ffa aaa aa ultra'],
      ['aaaaaaaaaaaaa', 'ffa aaa aa ultra'],
      ['car', 'cartwheel'],
      ['cwheel', 'cartwheel']
    ];

Test runner

Ready to run.

Testing in
TestOps/sec
original
// implementation
function fuzzysearch (query, text) {
  var i;
  var character;
  var currentIndex;
  var lastIndex = -1;
  var tlen = text.length;
  var qlen = query.length;
  if (qlen > tlen) {
    return false;
  }
  if (qlen === tlen && query === text) {
    return true;
  }
  if (text.indexOf(query) > lastIndex) {
    return true;
  }
  for (i = 0; i < qlen; i++) {
    character = query[i];
    currentIndex = text.indexOf(character, lastIndex + 1);
    if (currentIndex === -1) {
      return false;
    }
    lastIndex = currentIndex;
  }
  return true;
}




// tests
cases.forEach(function (c) {
  fuzzysearch(c[0], c[1]);
});
ready
regex-based
// implementation
function escapeRegExp(str) {
  return str.replace(/[-{}()*+?.^$|[\]]/g, '\\$&');
}

function toReg(query) {
  var x = String(query).split('').map(escapeRegExp).join('.*?');
  x = '(?:' + x + ')';
  return new RegExp(x);
}

function fuzzysearch(query, text) {
  if (typeof query === 'string' && typeof text === 'string' && query.length && text.length) {
    return toReg(query).test(text);
  }
  return false;
}





// tests
cases.forEach(function (c) {
  fuzzysearch(c[0], c[1]);
});
ready
dfkaye-replacer-fn-based
// impl
function fuzzysearch(query, text) {
  if (typeof query === 'string' && typeof text === 'string' && query.length && text.length) {

    query = query.replace(/[-{}()*+?.^$|[\]]/g , function (m) {
      return '\\$&';
    }).split('').join('.*?');
    
    query = '(?:' + query + ')';
    
    return (RegExp(query).test(text));
  }
  return false;
}

// tests
cases.forEach(function (c) {
  fuzzysearch(c[0], c[1]);
});
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.