Skip to content

Instantly share code, notes, and snippets.

@colingourlay
Last active October 22, 2021 15:16
Show Gist options
  • Save colingourlay/82506396503c05e2bb94 to your computer and use it in GitHub Desktop.
Save colingourlay/82506396503c05e2bb94 to your computer and use it in GitHub Desktop.
Lodash / Underscore sort object keys. Like _.sortBy(), but on keys instead of values, returning an object, not an array. Defaults to alphanumeric sort.
var obj = {b: 3, c: 2, a: 1};
_.sortKeysBy(obj);
// {a: 1, b: 3, c: 2}
_.sortKeysBy(obj, function (value, key) {
return value;
});
// {a: 1, c: 2, b: 3}
_.mixin({
'sortKeysBy': function (obj, comparator) {
var keys = _.sortBy(_.keys(obj), function (key) {
return comparator ? comparator(obj[key], key) : key;
});
return _.object(keys, _.map(keys, function (key) {
return obj[key];
}));
}
});
@jhyland87
Copy link

Nice job! I found this when writing my own version, which did the exact same thing, but no comparator. So I used yours, http://pastebin.com/XWv803UF

@ilyador
Copy link

ilyador commented Feb 29, 2016

There is no _.object in Lodash, should be _.zipObject

@mrienstra
Copy link

v0.4.0: Added _.zipObject

v0.7.0: Renamed _.zipObject to _.object

v1.1.0: Made _.object an alias of _.zipObject

v4.0.0:

  • Removed _.object in favor of _.fromPairs
  • Split _.zipObject into _.fromPairs

In other words, _.object hasn't been available since v4.0.0 (Jan. 12, 2016), _.zipObject has been available since v1.1.0 (Mar. 26, 2013).

@gor181
Copy link

gor181 commented Dec 28, 2016

when using fromPairs it would be:

const sortByKeys = object => {
  const keys = Object.keys(object)
  const sortedKeys = _.sortBy(keys)

  return _.fromPairs(
    _.map(sortedKeys, key => [key, object[key]])
  )
}

In case anyone requires it.
This is not a mixin, but you can make one if needed, we use it as a util though.

@anhtuank7c
Copy link

@gor181

Thank you so much!

@rickcha
Copy link

rickcha commented Aug 2, 2017

You are awesome..

@frankdavidcorona
Copy link

@gor181 Gotcha !

@Soufien
Copy link

Soufien commented Apr 13, 2018

@gor181 Thank you so much ! that's awesome !

@sobinsunny
Copy link

@gor181 Great!! @ @

@simonyost
Copy link

Thank you!!

@kstankov
Copy link

@gor181 - thanks!

@KarmaBlackshaw
Copy link

KarmaBlackshaw commented Jun 25, 2020

Hi! I'm having trouble reversing this object using the function tho

const object = {
  202: {
    id: 61,
    play_date: '2020-05-28 16:53:00',
    round: 204,
    status: 'N'
  },
  203: {
    id: 66,
    play_date: '2020-05-28 16:53:00',
    round: 203,
    status: 'N'
  }
}

Expected output will be:

{
  203: {
    id: 66,
    play_date: '2020-05-28 16:53:00',
    round: 203,
    status: 'N'
  },
  202: {
    id: 61,
    play_date: '2020-05-28 16:53:00',
    round: 204,
    status: 'N'
  }
}

@drex44
Copy link

drex44 commented Feb 19, 2021

Small variation that works with nested objects as well:

const sortByKeys = object => {
  const keys = Object.keys(object);
  const sortedKeys = _.sortBy(keys);

  return _.fromPairs(
    _.map(sortedKeys, key => {
      let value = object[key];
      if (typeof object[key] === "object" && !(object[key] instanceof Array)) {
        value = sortByKeys(value);
      }
      return [key, value];
    })
  );
};

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment