Array intersection comparison

Benchmark created on


Setup

const arrayLength = 10000;

const array1 = Array.from({length: arrayLength}, () => Math.floor(Math.random() * arrayLength));
const array2 = Array.from({length: arrayLength}, () => Math.floor(Math.random() * arrayLength));

Test runner

Ready to run.

Testing in
TestOps/sec
for-loops
function intersect_for(a, b) {
  const result = [];
  const alen = a.length;
  const blen = b.length;
  for (let i = 0; i < alen; ++i) {
    const ai = a[i];
    for (let j = 0; j < blen; ++j) {
      if (ai === b[j]) {
        result.push(ai);
        break;
      }
    }
  } 
  return result;
}

intersect_for(array1, array2)
ready
filter + indexOf
function intersect_filter_indexOf(a, b) {
  return a.filter(el => b.indexOf(el) !== -1);
}

intersect_filter_indexOf(array1, array2)
ready
filter + in
function intersect_filter_in(a, b) {
  const map = b.reduce((map, el) => {map[el] = true; return map}, {});
  return a.filter(el => el in map);
}

intersect_filter_in(array1, array2)
ready
for-loop + in
function intersect_for_in(a, b) {
  const result = [];
  const map = {};
  for (let i = 0, length = b.length; i < length; ++i) {
    map[b[i]] = true;
  }
  for (let i = 0, length = a.length; i < length; ++i) {
    if (a[i] in map) result.push(a[i]);
  }
  return result;
}

intersect_for_in(array1, array2)
ready
filter + includes
function intersect_filter_includes(a, b) {
  return a.filter(el => b.includes(el));
}

intersect_filter_includes(array1, array2)
ready
filter + has (this)
function intersect_filter_has_this(a, b) {
  return a.filter(Set.prototype.has, new Set(b));
}

intersect_filter_has_this(array1, array2)
ready
filter + has (arrow function)
function intersect_filter_has_arrow(a, b) {
  const set = new Set(b);
  return a.filter(el => set.has(el));
}

intersect_filter_has_arrow(array1, array2)
ready
for + has
function intersect_for_has(a, b) {
  const result = [];
  const set = new Set(b);
  for (let i = 0, length = a.length; i < length; ++i) {
    if (set.has(a[i])) result.push(a[i]);
  }
  return result;
}

intersect_for_has(array1, array2)
ready

Revisions

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