JS Apriori

Apriori algorithm by JS.

by Tinytsunami

HTML

<div id="demo">
  Minimum support: <input type="text" value="0.8"><button>Evaluation</button><br />
  <button>New serial</button>
  <table>
    <tr>
      <th>ID</th>
      <th colspan="2">Items</th>
    </tr>
  </table>
  <pre></pre>
</div>

CSS

body {
  color: #ffffff;
  background: #20262e;
  font-family: monospace, sans-serif;
}

#demo table td,
#demo table th {
  border: solid 1px #ffffff;
  padding: 2px;
}

#demo input {
  width: 50px;
  color: #ffffff;
  background: #20262e;
  border: none;
  border-bottom: solid 1px #ffffff;
  outline: none;
}

#demo>input {
  margin-right: 5px;
}

#demo table input {
  width: 300px;
  border: none;
}

#demo button {
  cursor: pointer;
  color: #ffffff;
  background: #20262e;
  border: 1px solid #ffffff;
  outline: none;
}

#demo button:hover {
  color: #20262e;
  background: #ffffff;
}

#demo>button {
  margin-bottom: 5px;
}

#demo table td>button {
  border: none;
}

JavaScript

(function() {
  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set
  Set.prototype.isSuperset = function(subset) {
    for (var elem of subset) {
      if (!this.has(elem)) {
        return false;
      }
    }
    return true;
  }

  Set.prototype.union = function(setB) {
    var union = new Set(this);
    for (var elem of setB) {
      union.add(elem);
    }
    return union;
  }

  Set.prototype.intersection = function(setB) {
    var intersection = new Set();
    for (var elem of setB) {
      if (this.has(elem)) {
        intersection.add(elem);
      }
    }
    return intersection;
  }

  Set.prototype.difference = function(setB) {
    var difference = new Set(this);
    for (var elem of setB) {
      difference.delete(elem);
    }
    return difference;
  }

  Set.prototype.equal = function(setB) {
    let a = this.difference(setB).size;
    let b = setB.difference(this).size;
    return (a === 0 && b === 0);
  }

  Set.prototype.subset = function() {
    let subset = [];
    subset.push(new Set([]));
    let origin = Array.from(this);
    for (let i = 1; i < (1 << origin.length) - 1; i++) {
      let arr = [];
      for (let j = 0; j < this.size; j++)
        if (i & (1 << j))
          arr.push(origin[j]);
      subset.push(new Set(arr));
    }
    return subset;
  }
})();

(function() {
  /* get elements */
  let root = document.getElementById("demo");
  let tableNode = root.getElementsByTagName("table")[0];
  let supportNode = root.getElementsByTagName("input")[0];
  let evaluationNode = root.getElementsByTagName("button")[0];
  let newSerialNode = root.getElementsByTagName("button")[1];
  let resultNode = root.getElementsByTagName("pre")[0];

  /* initialize variables */
  let id = 1;

  /* get random number (integer) */
  let randInt = function(min, max) {
    return Math.floor((Math.random() * 0xFFFF) % (max - min) + min);
  };

  /* fix float */
  let fixFloat = function(number, digit) {
    return...