Object indexing - key/value -> array (v6)

Revision 6 of this benchmark created on


Preparation HTML

<script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/2.4.1/lodash.js"></script>
<script>
var rnd = 2377203948;
function nextRnd(n) {
  rnd = rnd + 1297357;
  return "a" + (rnd ^ (rnd >>> 8) ^ (rnd >>> 16)) % n;
}

function nextObj(i) {
  var n = 1;
  var obj = {
    "id": "38DAS937-"+(i+1000),
    "loremFistrumQue": nextRnd(n+=2),
    "diseUsteerTe": nextRnd(n+=2),
    "vaAHasePupita": nextRnd(n+=2),
    "deLa": nextRnd(n+=2),
    "praderaCaballoBlanco": nextRnd(n+=2),
    "caballoNegroorlTe": nextRnd(n+=2),
    "teVoyABorrarelCerito": nextRnd(n+=2),
    "benemeritaarFistrodela": nextRnd(n+=2),
    "praderaAlAtaquerldeLapradera": nextRnd(n+=2),
    "tieneMushoPeligro": nextRnd(n+=2),
    "aPeichDiodenoo": nextRnd(n+=2),
    "caballoBlanco": nextRnd(n+=2),
    "caballoNegroorl": nextRnd(n+=2),
    "seCalleUstee": nextRnd(n+=2),
  } 
  return obj;
}

var i,arr = [];
for (i = 0; i < 1000; i++) {
  arr.push(nextObj(i));
}
</script>

Test runner

Ready to run.

Testing in
TestOps/sec
key/value
var indices = {}, sets, set, i, l, j, m, key, value, obj;

l = arr.length;
keys = Object.keys(arr[0]);
m = keys.length;
for (j = 0; j < m; j++) {
  key = keys[j];
  if (key !== 'id') {
    sets = indices[key] = {};

    for (i = 0; i < l; i++) {
      obj = arr[i];
      value = obj[key];

      set = sets[value];
      if (!set) {
        sets[value] = set = [];
      }

      set.push(obj);
    }
  }
}
 
ready
value/key
var indices = {}, sets, set, i, l, j, m, key, value, obj;

l = arr.length;
keys = Object.keys(arr[0]);
m = keys.length;
for (i = 0; i < l; i++) {
  obj = arr[i];

  for (j = 0; j < m; j++) {
    key = keys[j];
    if (key !== 'id') {
      value = obj[key];

      sets = indices[key];
      if (!sets) {
        indices[key] = sets = {};
      }

      set = sets[value];
      if (!set) {
        sets[value] = set = [];
      }

      set.push(obj);
    }
  }
}
ready
forIn/value lodash
var indices = {};

_.forIn(arr[0], function(_a, key) {
  var sets;
  if (key !== 'id') {
    sets = indices[key] = {};

    _.each(arr, function(obj) {
      var value, set;

      value = obj[key];

      set = sets[value];
      if (!set) {
        sets[value] = set = [];
      }

      set.push(obj);
    });
  }
});
 
ready
forOwn/value lodash
var indices = {};

_.forOwn(arr[0], function(_a, key) {
  var sets;
  if (key !== 'id') {
    sets = indices[key] = {};

    _.each(arr, function(obj) {
        var value, set;

        value = obj[key];

        set = sets[value];
        if (!set) {
          sets[value] = set = [];
        }

        set.push(obj);
    });
  }
});

 
ready
value/forIn lodash
var indices = {};

_.each(arr, function(obj) {
  _.forIn(arr[0], function(_a, key) {
    var value, sets, set;

    if (key !== 'id') {
      value = obj[key];

      sets = indices[key];
      if (!sets) {
        indices[key] = sets = {};
      }

      set = sets[value];
      if (!set) {
        sets[value] = set = [];
      }

      set.push(obj);
    }
  });
});
 
ready
value/forOwn lodash
var indices = {};

_.each(arr, function(obj) {
  _.forOwn(arr[0], function(_a, key) {
    var value, sets, set;

    if (key !== 'id') {
      value = obj[key];

      sets = indices[key];
      if (!sets) {
        indices[key] = sets = {};
      }

      set = sets[value];
      if (!set) {
        sets[value] = set = [];
      }

      set.push(obj);
    }
  });
});
 
ready
key/value lodash
var indices = {}, keys;

keys = Object.keys(arr[0]);
_.each(keys, function(key) {
  var sets;
  if (key !== 'id') {
    sets = indices[key] = {};

    _.each(arr, function(obj) {
        var value, set;

        value = obj[key];

        set = sets[value];
        if (!set) {
          sets[value] = set = [];
        }

        set.push(obj);
    });
  }
});
ready
value/key lodash
var indices = {}, keys;

keys = Object.keys(arr[0]);
_.each(arr, function(obj) {
  _.each(keys, function(key) {
    var value, sets, set;

    if (key !== 'id') {
      value = obj[key];

      sets = indices[key];
      if (!sets) {
        indices[key] = sets = {};
      }

      set = sets[value];
      if (!set) {
        sets[value] = set = [];
      }

      set.push(obj);
    }
  });
});
ready
value/(key w/o id) lodash
var indices = {}, keys;

keys = Object.keys(arr[0]);
keys.splice(keys.indexOf('id'), 1);
_.each(arr, function(obj) {
  _.each(keys, function(key) {
    var value, sets, set;

      value = obj[key];

      sets = indices[key];
      if (!sets) {
        indices[key] = sets = {};
      }

      set = sets[value];
      if (!set) {
        sets[value] = set = [];
      }

      set.push(obj);
  });
});
 
ready
forOwn/groupBy lodash
var indices = {};

_.forOwn(arr[0], function(_a, key) {
  var sets;
  if (key !== 'id') {
    indices[key] = _.groupBy(arr, key);
  }
});
 
ready
for -- in own key/value
var indices = {}, sets, set, i, l, key, value, obj, obj0;

l = arr.length;
obj0 = arr[0];
for (key in obj0) {
 if (obj0.hasOwnProperty(key)) {
  if (key !== 'id') {
    sets = indices[key] = {};

    for (i = 0; i < l; i++) {
      obj = arr[i];
      value = obj[key];

      set = sets[value];
      if (!set) {
        sets[value] = set = [];
      }

      set.push(obj);
    }
  }
 }
}
 
ready
three phases (hasOwn)
var indices = {}, sets, set, i, l, key, keys, keyHash, value, obj;

keyHash = {};
l = arr.length;
for (i = 0; i < l; i++) {
  obj = arr[i];
  for (key in obj) {
    if (obj.hasOwnProperty(key)) {
      keyHash[key] = true;
    }
  }
}

keys = [];
for (key in keyHash) {
  if (obj.hasOwnProperty(key)) {
    if (key !== 'id') {
      keys.push(key);
    }
  }
}

m = keys.length;
for (j = 0; j < m; j++) {
  key = keys[j];
  sets = indices[key] = {};

    for (i = 0; i < l; i++) {
      obj = arr[i];
      value = obj[key];

      set = sets[value];
      if (!set) {
        sets[value] = set = [];
      }

      set.push(obj);
    }
}

 
ready
three phases (.keys)
var indices = {}, sets, set, i, l, key, keys, keyHash, value, obj;

keyHash = {};
l = arr.length;
for (i = 0; i < l; i++) {
  obj = arr[i];
  keys = Object.keys(obj);
  m = keys.length;
  for (j = 0; j < m; j++) {
      key = keys[m];
      keyHash[key] = true;
  }
}

keys = [];
for (key in keyHash) {
  if (obj.hasOwnProperty(key)) {
    if (key !== 'id') {
      keys.push(key);
    }
  }
}

m = keys.length;
for (j = 0; j < m; j++) {
  key = keys[j];
  sets = indices[key] = {};

    for (i = 0; i < l; i++) {
      obj = arr[i];
      value = obj[key];

      set = sets[value];
      if (!set) {
        sets[value] = set = [];
      }

      set.push(obj);
    }
}
 
ready

Revisions

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