I think you were almost there. It is important to note that .groupBy returns a collection of lists, so when you call sorting, you need a comparator that compares two different lists, not two elements. You can do this easily by simply comparing the state of the first item in each list. After that, you want to sort each list by date, so use .map to apply changes to each list in your list, then .sortBy in this list to sort by a specific key. Assuming you are using the built-in Date type, just sorting by this field should do what you want .
var MyData = [ {"id": 1, "status": "live", dateCreated: "12:00:00 01/02/2016"}, {"id": 2, "status": "draft", dateCreated: "13:00:00 03/12/2015"}, {"id": 3, "status": "ready", dateCreated: "16:00:00 04/09/2016"}, {"id": 4, "status": "ready", dateCreated: "10:00:00 01/10/2016"}, {"id": 5, "status": "live", dateCreated: "09:00:00 05/07/2015"}, {"id": 6, "status": "draft", dateCreated: "08:00:00 11/03/2016"}, {"id": 7, "status": "ready", dateCreated: "20:00:00 12/02/2016"} ] Immutable.fromJs(MyData) // [{id: 1, ...}, ...] .groupBy(item => item.status) // group items into lists by status // [ 'live': [ { id: 1, ... }, { id:5, ... } ], // 'draft': [ { id: 2, ... }, { id: 6, ...} ], // 'ready': [ { id: 3, ... }, { id: 4, ... }, { id: 7, ... } ] ] .sort((listA, listB) => // order these groups by status itemOrder[listA.first().status] - itemOrder[listB.first().status]) // [ 'live': [ { id: 1, ...}, ... ], // 'ready': [ { id: 3, ...}, ... ], // 'draft': [ { id: 2, ...}, ... ] ] .map(list => list.sortBy(item => item.dateCreated)); // sort the elements in each group by date // [ 'live': [ { id: 5, ... }, { id: 1, ... } ], // 'ready': [ { id: 4, ... }, { id: 3, ... }, { id: 7, ... } ], // 'draft': [ { id: 2, , ...}, { id: 6, ... } ] ]