Script Preparation code:
x
 
var empty = { id: '', number: 10000 };
var array1 = [empty];
var array2 = [empty];
var entities = { '': empty };
var id = '';
for (let i = 0; i < 1500; i++) {
  id = String(i);
  entities[id] = { id, number: i }
}
function getRandomInt(min, max) {
  min = Math.ceil(min);
  max = Math.floor(max);
  return Math.floor(Math.random() * (max - min) + min); //The maximum is exclusive and the minimum is inclusive
}
for (let i = 0; i < 500; i++) {
  array1.push(entities[getRandomInt(i, 1500)]);
}
for (let i = 0; i < 500; i++) {
  array2.push(entities[getRandomInt(i, 1500)]);
}
Tests:
  • Array.includes - reduce

     
    var data = Array.from(new Set([...array1, ...array2])).reduce(
      (acc, item) => {
        if (array1.includes(item)) {
          if (array2.includes(item)) {
            acc.union.push(item);
          } else {
            acc.lhsOnly.push(item);
          }
        } else {
          acc.rhsOnly.push(item);
        }
        return acc;
      },
      { rhsOnly: [], lhsOnly: [], union: [] }
    );
    console.log(data)
  • Array.includes - for of

     
    var unionArray = Array.from(new Set([...array1, ...array2]));
    var data = { rhsOnly: [], lhsOnly: [], union: [] }
    for (var item of unionArray) {
      if (array1.includes(item)) {
        if (array2.includes(item)) {
          data.union.push(item);
        } else {
          data.lhsOnly.push(item);
        }
      } else {
        data.rhsOnly.push(item);
      }
    }
    console.log(data)
  • Map.has

     
    var lMap = new Map(array1.map((item) => [item, true]));
    var rMap = new Map(array2.map((item) => [item, true]));
    var unionSet = new Set([...lMap.values(), ...rMap.values()]);
    var result = { rhsOnly: [], lhsOnly: [], union: [] };
    for (var item of unionSet) {
      if (lMap.has(item)) {
        if (rMap.has(item)) {
          result.union.push(item);
        } else {
          result.lhsOnly.push(item);
        }
      } else {
        result.rhsOnly.push(item);
      }
    }
    console.log(result)
  • Set.has

     
    var lSet = new Set(array1);
    var rSet = new Set(array2);
    var unionSet = new Set([...lSet.values(), ...rSet.values()]);
    var result = { rhsOnly: [], lhsOnly: [], union: [] };
    for (var item of unionSet) {
      if (lSet.has(item)) {
        if (rSet.has(item)) {
          result.union.push(item);
        } else {
          result.lhsOnly.push(item);
        }
      } else {
        result.rhsOnly.push(item);
      }
    }
    console.log(result)
Rendered benchmark preparation results:

Suite status: <idle, ready to run>

Previous results

Experimental features:

  • Test case name Result
    Array.includes - reduce
    Array.includes - for of
    Map.has
    Set.has

    Fastest: N/A

    Slowest: N/A

Latest run results:
Run details: (Test run date: 3 years ago)
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36
Chrome 98 on Mac OS X 10.15.7
View result in a separate tab
Test name Executions per second
Array.includes - reduce 2707.4 Ops/sec
Array.includes - for of 2696.5 Ops/sec
Map.has 11667.2 Ops/sec
Set.has 8881.0 Ops/sec