Angular.js Natural Sorting for orderBy
Creates a natural sorting function for use within Angular.js's built-in orderBy filter.
HTML
<div ng-app="myApp" ng-controller="myCtrl">
<ul>
<li ng-repeat="item in items | orderBy:natural('name')">
{{ item.name }}
</li>
</ul>
</div>
JavaScript
angular.module("myApp", ["naturalSort"]).
controller("myCtrl", ["$scope", function($scope) {
var item = function(id, name) {
return {id: id, name: name};
};
$scope.items = [
item(1, "number 1.jpg"),
item(2, "number 2.jpg"),
item(3, "number 11.jpg"),
item(4, "number 3.jpg"),
item(5, "number 1.121.jpg"),
item(6, "number 1.12.jpg"),
item(7, "date 1-4-2012.jpg"),
item(8, "date 12-12-1999.jpg"),
item(9, "date 04.05.2001 (3).jpg"),
item(10, "date 04-05-2001 (10).jpg"),
item(11, "date 04/05/2001.jpg"),
item(11, "version 1.10.5.jpg"),
item(11, "version 0.0.1.jpg"),
item(11, "version 0.1.0.jpg"),
item(11, "version 1.10.12.jpg"),
item(11, "version 1.3.3.jpg"),
item(11, "version 1.10.11.jpg"),
item(11, "mixed 0.11.5 4 3/2/1999.jpg"),
item(11, "mixed 0.1.6 4 3/2/1999.jpg"),
item(11, "mixed 0.11.5 10 3/2/1999.jpg"),
item(11, "mixed 0.11.5 4 4/31/1990.jpg"),
item(11, "mixed 0.11.5 4 1/1/2013.jpg")
];
}]);
// Create a module for naturalSorting
angular.module("naturalSort", [])
// The core natural service
.factory("naturalService", ["$locale", function($locale) {
// the cache prevents re-creating the values every time, at the expense of
// storing the results forever. Not recommended for highly changing data
// on long-term applications.
var natCache = {},
// amount of extra zeros to padd for sorting
padding = function(value) {
return '00000000000000000000'.slice(value.length);
},
// Calculate the default out-of-order date format (d/m/yyyy vs m/d/yyyy)
natDateMonthFirst = $locale.DATETIME_FORMATS.shortDate.charAt(0) == 'm';
// Replaces all suspected dates with a standardized yyyy-m-d, which is fixed below
fixDates = function(value) {
// first look for dd?-dd?-dddd, where "-" can be one of "-", "/", or "."
return...