How to sort object data source in ng-repeat in AngularJS? How to sort object data source in ng-repeat in AngularJS? angularjs angularjs

How to sort object data source in ng-repeat in AngularJS?


While you would see this in the thread the author's answer references in a link, I thought it would be good to put up one of the mentioned workarounds up on SO:

It is true that this is technically not implemented, but there is an easy work around if you're willing to change your data model slightly: use a custom filter to generate an array of the object's properties (without replacement). If you add the key field to the objects ("id" in the above case), you should be able to get the behavior your looking for:

app.filter("toArray", function(){    return function(obj) {        var result = [];        angular.forEach(obj, function(val, key) {            result.push(val);        });        return result;    };});...$scope.users = {    1: {name: "John", email: "john@gmail.com", id: 1},    2: {name: "Elisa", email: "elisa@gmail.com", id: 2}};

Here's the ng-repeat directive that could be used:

<option value="{{user.id}}" ng-repeat="user in users | toArray | orderBy:'name'">{{user.name}}</option>

And here's the plunkr.

Notice that the orderBy filter takes name as its parameter and not user.name.

Unfortunately, adding the id property to your objects does create potential for mismatch with it's key in the containing object.

In the link you mentioned in your answer, there are also proposed solutions that create the id property in the user objects on the fly, but I feel like this approach is a little less messy (at the cost of introducing data replication).


Adding to the accepted answer and seeing your data format, you should transform your data as

app.filter('myFilterUsers',function(){    return function(data)    {        var newRes = [];        angular.forEach(data,function(val,key){            val["id"] = key;  //Add the ID in the JSON object as you need this as well.            newRes.push(val);        });        return newRes;    }});