8
votes

I have a list of users (six to be exact) in a collection with 'firstname', 'lastname' properties. Doing a fetch, the comparator below sorts them by 'firstname', and it works fine.

comparator : function (user) {
  return user.get("firstname").toLowerCase();
}

But if I try to sort the collection later, by a different value i.e. 'lastname', it doesn't work. The order stays the same.

this.collection.sortBy(function(user) {
  return user.get("lastname").toLowerCase();
});

What am i doing wrong?


Update


So the data returned from sortBy IS sorted but that doesn't help me really as my view is linked to the collection. If i reset the collection and add the sorted array back to the collection it's comparator does it's job and sorts it back into 'firstname' order.

var sorted = this.collection.sortBy(function(user) {
  return user.get("lastname").toLowerCase();
});
3

3 Answers

13
votes

To respond to your update:

If you're wanting to change the order that the collection is sorted in for use by it's corresponding view then you could just update the comparator and then call sort to get the model re-sorted. This will then fire a sort event which your view can listen for and update itself accordingly.

this.collection.comparator = function (user) {
  return user.get("firstname").toLowerCase();
};

this.collection.sort();
12
votes

The sortBy function does not sort the objects in the current collection. It returns a sorted collection:


var sortedCollection = this.collection.sortBy(function(user){
  return user.get("lastname").toLowerCase();
});

Now you can use sortedCollection and it will be sorted correctly.

3
votes

Underscore's sortBy which Backbone uses, returns the sorted collection not sort it in place... To illustrate:

var flinstones = [{first: 'Baby', last: 'Puss'}, {first: 'Fred', last: 'Flinstone'}];
var sorted = _.sortBy(flinstones, function (character) { return character.last ; });
console.log(sorted);
console.log(flinstones);