angular.module('orderByExample', []) .controller('ExampleController', ['$scope', function($scope) { var friends = [{name:'Jon', phone:'555-1212', age:10}, {name:'Zach', phone:'555-2276', age:7}, {name:'Zach', phone:'555-9876', age:19}, {name:'Zach', phone:'555-9276', age:13}, {name:'Mike', phone:'555-4321', age:21}, {name:'Adam', phone:'555-5678', age:35}, {name:'Julie', phone:'555-8765', age:29}]; function getName(f){ return f.name; } function getAge(f){ return f.age; } var orderByName = new OrderByBuilder().desc(getName).build(); var orderByNameAndAge = new OrderByBuilder().desc(getName).asc(getAge).build(); $scope.friendLists = [ {label:'Not Ordered', friends: friends}, {label:'Name DESC', friends: orderByName(friends)}, {label:'Name DESC, Age ASC', friends: orderByNameAndAge(friends)} ]; }]); function OrderByBuilder(orderings){ var _orderings = []; return { asc: function(fn){ addOrdering(true,fn); return this; }, desc: function(fn){ addOrdering(false,fn); return this; }, build: build }; function addOrdering(asc,fn){ _orderings.push({ getterFn: fn, asc: asc }); return this; } function build(){ var compare = _orderings.reverse().reduce(function(nextComparer, ordering){ return getComparerFn(ordering, nextComparer); },null); return function(xs){ return xs.slice().sort(compare); }; }
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.4.0-beta.6/angular.min.js"></script> <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css"> <div ng-app="orderByExample"> <div ng-controller="ExampleController"> <div class="row"> <div ng-repeat="friendList in friendLists" class="col-sm-4"> <h4>{{friendList.label}}</h4> <table class="table table-bordered table-condensed"> <tr> <th>Name</th> <th>Phone Number</th> <th>Age</th> </tr> <tr ng-repeat="friend in friendList.friends"> <td>{{friend.name}}</td> <td>{{friend.phone}}</td> <td>{{friend.age}}</td> </tr> </table> </div> </div> </div> </div>