Multidimensional Sort

by iamjoshhansen

JavaScript 1.7

function byObjectValues(keys) {
  return function(a, b) {
    const firstKey = keys[0];
    const isSimple = typeof firstKey === 'string';
    const key = isSimple ? firstKey : firstKey.key;
    const rev = isSimple ? false : !!firstKey.reverse;
    const map = isSimple ? null : firstKey.map || null;

    const valA = map ? map(a[key]) : a[key];
    const valB = map ? map(b[key]) : b[key];
    if (valA === valB) {
      if (keys.length === 1) {
        return 0;
      }
      return byObjectValues(keys.slice(1))(a, b);
    }
    if (rev) {
      return valA > valB ? -1 : 1;
    }
    return valA > valB ? 1 : -1;
  };
}