sort-object-keys

Benchmark created on


Setup

var makeObject = (size) => Object.fromEntries(
  Array.from({ length: size }, (_, i) => {
  	return [Math.random().toString(36).slice(2), i ]
  })
)
var localeCompare = (a, b) => a.localeCompare(b);
var small = makeObject(20);
var medium = makeObject(100);
var large = makeObject(500);

Test runner

Ready to run.

Testing in
TestOps/sec
Original O(n ^ 2)
function sortObjectByKeyNameList(object, sortWith) {
  var keys;
  var sortFn;

  if (typeof sortWith === 'function') {
    sortFn = sortWith;
  } else {
    keys = sortWith;
  }

  var objectKeys = Object.keys(object);
  return (keys || []).concat(objectKeys.sort(sortFn)).reduce(function(total, key) {
    if (objectKeys.indexOf(key) !== -1) {
      total[key] = object[key];
    }
    return total;
  }, Object.create(null));
}

sortObjectByKeyNameList(small, localeCompare);
sortObjectByKeyNameList(medium, localeCompare);
sortObjectByKeyNameList(large, localeCompare);

ready
O(n log n)
function sortObjectByKeyNameList(object, sortWith) {
  var keys;
  var sortFn;

  if (typeof sortWith === 'function') {
    sortFn = sortWith;
  } else {
    keys = sortWith;
  }

  var objectKeys = Object.keys(object);
  return (keys || []).concat(objectKeys.sort(sortFn)).reduce(function(total, key) {
    if (Object.prototype.hasOwnProperty.call(object, key)) {
      total[key] = object[key];
    }
    return total;
  }, Object.create(null));
}

sortObjectByKeyNameList(small, localeCompare);
sortObjectByKeyNameList(medium, localeCompare);
sortObjectByKeyNameList(large, localeCompare);
ready

Revisions

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