I'm not sure if this is an error or an adaptation function of Backbone sortBy , but apparently it returns an array, not a collection of Underscore.
One way to wrap everything in _( ... ) , which tells Underscore to return the array to the collection:
var SortedFriends = _(MyFriends.sortBy(function(friend) { return friend.get("uid"); }));
Edit
Most of the Underscore methods in Backbone seem to be chain-related (like replacing sortBy with reject , and it works). Looking at the source of the baseline where they connect the underscore proxies, it seems that sortBy handled differently. I canβt understand why they are doing this ...
var methods = ['forEach', 'each', 'map', 'collect', 'reduce', 'foldl', 'inject', 'reduceRight', 'foldr', 'find', 'detect', 'filter', 'select', 'reject', 'every', 'all', 'some', 'any', 'include', 'contains', 'invoke', 'max', 'min', 'toArray', 'size', 'first', 'head', 'take', 'initial', 'rest', 'tail', 'drop', 'last', 'without', 'indexOf', 'shuffle', 'lastIndexOf', 'isEmpty', 'chain']; _.each(methods, function(method) { Collection.prototype[method] = function() { var args = slice.call(arguments); args.unshift(this.models); return _[method].apply(_, args); }; }); var attributeMethods = ['groupBy', 'countBy', 'sortBy']; _.each(attributeMethods, function(method) { Collection.prototype[method] = function(value, context) { var iterator = _.isFunction(value) ? value : function(model) { return model.get(value); }; return _[method](this.models, iterator, context); };