CP Nest

by olymccollum

HTML

<script src="https://d3js.org/d3.v3.js"></script>

JavaScript

var workloads = [
	{ name: 'vm001', cluster: 'c1', host: 'host1', application: ['app A', 'app B'] },
	{ name: 'vm002', cluster: 'c1', host: 'host1', application: ['app C'] },
	{ name: 'vm003', cluster: 'c1', host: 'host1', application: ['app D', 'app E'] },
	{ name: 'vm004', cluster: 'c1', host: 'host1', application: ['app F'] },
	{ name: 'vm005', cluster: 'c1', host: 'host1', application: ['app G'] },
	{ name: 'vm006', cluster: 'c1', host: 'host1', application: ['app H'] },
	{ name: 'vm007', cluster: 'c1', host: 'host2', application: ['app AA'] },
	{ name: 'vm008', cluster: 'c1', host: 'host2', application: ['app AA'] },
	{ name: 'vm009', cluster: 'c1', host: 'host2', application: ['app AA'] },
	{ name: 'vm010', cluster: 'c1', host: 'host2', application: ['app AA'] },
	{ name: 'vm011', cluster: 'c2', host: 'host3', application: ['app BB'] },
	{ name: 'vm012', cluster: 'c2', host: 'host3', application: ['app CC'] },
	{ name: 'vm013', cluster: 'c2', host: 'host3', application: ['app DD', 'app EE'] },
	{ name: 'vm014', cluster: 'c2', host: 'host3', application: ['app DD', 'app EE'] },
	{ name: 'vm015', cluster: 'c2', host: 'host3', application: ['app DD', 'app EE'] }
];

console.log(workloads);

var cp = {};
cp.nest = function() {
	var nest = {},
		keys = [];

  function map(mapType, array, depth) {
    if (depth >= keys.length) return rollup
        ? rollup.call(nest, array) : (sortValues
        ? array.sort(sortValues)
        : array);

    var i = -1,
        n = array.length,
        key = keys[depth++],
        keyValue,
        object,
        setter,
        valuesByKey = new d3_Map,
        values;

    while (++i < n) {
      if (values = valuesByKey.get(keyValue = key(object = array[i]))) {
        values.push(object);
      } else {
        valuesByKey.set(keyValue, [object]);
      }
    }

    if (mapType) {
      object = mapType();
      setter = function(keyValue, values) {
        object.set(keyValue, map(mapType, values, depth));
      };
    }...