fuzzysearch-regex (v5)

Revision 5 of this benchmark created by Ingvar Stepanyan on


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
mraleph
// implementation
function fuzzysearch (query, text) {
  var tlen = text.length;
  var qlen = query.length;
  if (qlen > tlen) {
    return false;
  }
  if (qlen === tlen && query === text) {
    return true;
  }
  outer: for (var i = 0, j = 0; i < qlen; i++) {
    var qch = query.charCodeAt(i);
    while (j < tlen) {
      if (text.charCodeAt(j++) === qch) {
        continue outer;
      }
    }
    return false;
  }
  return true;
}

// tests
cases.forEach(function (c) {
  fuzzysearch(c[0], c[1]);
});
ready
crazy-one
// implementation
function $fuzzysearch (query, text) {
  var tlen = text.length;
  var qlen = query.length;
  if (qlen > tlen) {
    return false;
  }
  outer: for (var i = 0, j = 0; i < qlen; i++) {
    var qch = query[i];
    while (j < text.length) {
      if (text[j++] === qch) {
        continue outer;
      }
    }
    return false;
  }
  return true;
}

function toArray(str) {
  var a = new Uint8Array(str.length);
  for (var i = 0; i < str.length; i++) {
    a[i] = str.charCodeAt(i);
  }
  return a;
}

function fuzzysearch(query, text) {
  return $fuzzysearch(toArray(query), toArray(text));
}

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