diff options
| -rw-r--r-- | CHANGELOG.md | 3 | ||||
| -rw-r--r-- | src/apis.js | 54 | ||||
| -rw-r--r-- | test/ApiSpecs.js | 17 |
3 files changed, 37 insertions, 37 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index c38ca167..b56a8bd6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ ### Bug Fixes - Number filter would return incorrect value when fractional part had leading zeros. +- Issue #399: return unsorted array if no predicate ### Breaking changes @@ -17,6 +18,8 @@ explicitly specified using $inject property. - Dynamic Iteration (ng:repeater) on <option> elements is no longer supported. Use ng:options - Removal of index formatter since its only use was with repeated options (see above) +- Not providing predicate to orderBy will now return the unsorted array, instead of ordering by + natural order. diff --git a/src/apis.js b/src/apis.js index 1e1bcae1..ce40517a 100644 --- a/src/apis.js +++ b/src/apis.js @@ -581,18 +581,17 @@ var angularArray = { {name:'Adam', phone:'555-5678', age:35}, {name:'Julie', phone:'555-8765', age:29}]"></div> - <pre>Sorting predicate = {{predicate}}</pre> + <pre>Sorting predicate = {{predicate}} reverse = {{reverse}}</pre> <hr/> + [ <a href="" ng:click="predicate=''">unsorted</a> ] <table ng:init="predicate='-age'"> <tr> - <th><a href="" ng:click="predicate = 'name'">Name</a> - (<a href ng:click="predicate = '-name'">^</a>)</th> - <th><a href="" ng:click="predicate = 'phone'">Phone</a> - (<a href ng:click="predicate = '-phone'">^</a>)</th> - <th><a href="" ng:click="predicate = 'age'">Age</a> - (<a href ng:click="predicate = '-age'">^</a>)</th> + <th><a href="" ng:click="predicate = 'name'; reverse=false">Name</a> + (<a href ng:click="predicate = '-name'; reverse=false">^</a>)</th> + <th><a href="" ng:click="predicate = 'phone'; reverse=!reverse">Phone</a></th> + <th><a href="" ng:click="predicate = 'age'; reverse=!reverse">Age</a></th> <tr> - <tr ng:repeat="friend in friends.$orderBy(predicate)"> + <tr ng:repeat="friend in friends.$orderBy(predicate, reverse)"> <td>{{friend.name}}</td> <td>{{friend.phone}}</td> <td>{{friend.age}}</td> @@ -615,7 +614,7 @@ var angularArray = { expect(repeater('.doc-example-live table', 'friend in friends').column('friend.age')). toEqual(['35', '10', '29', '19', '21']); - element('.doc-example-live a:contains("Phone")+a:contains("^")').click(); + element('.doc-example-live a:contains("Phone")').click(); expect(repeater('.doc-example-live table', 'friend in friends').column('friend.phone')). toEqual(['555-9876', '555-8765', '555-5678', '555-4321', '555-1212']); expect(repeater('.doc-example-live table', 'friend in friends').column('friend.name')). @@ -624,35 +623,34 @@ var angularArray = { </doc:scenario> </doc:example> */ - //TODO: WTH is descend param for and how/when it should be used, how is it affected by +/- in - // predicate? the code below is impossible to read and specs are not very good. - 'orderBy':function(array, expression, descend) { - expression = isArray(expression) ? expression: [expression]; - expression = map(expression, function($){ - var descending = false, get = $ || identity; - if (isString($)) { - if (($.charAt(0) == '+' || $.charAt(0) == '-')) { - descending = $.charAt(0) == '-'; - $ = $.substring(1); + 'orderBy':function(array, sortPredicate, reverseOrder) { + if (!sortPredicate) return array; + sortPredicate = isArray(sortPredicate) ? sortPredicate: [sortPredicate]; + sortPredicate = map(sortPredicate, function(predicate){ + var descending = false, get = predicate || identity; + if (isString(predicate)) { + if ((predicate.charAt(0) == '+' || predicate.charAt(0) == '-')) { + descending = predicate.charAt(0) == '-'; + predicate = predicate.substring(1); } - get = expressionCompile($).fnSelf; + get = expressionCompile(predicate).fnSelf; } - return reverse(function(a,b){ + return reverseComparator(function(a,b){ return compare(get(a),get(b)); }, descending); }); var arrayCopy = []; for ( var i = 0; i < array.length; i++) { arrayCopy.push(array[i]); } - return arrayCopy.sort(reverse(comparator, descend)); + return arrayCopy.sort(reverseComparator(comparator, reverseOrder)); function comparator(o1, o2){ - for ( var i = 0; i < expression.length; i++) { - var comp = expression[i](o1, o2); + for ( var i = 0; i < sortPredicate.length; i++) { + var comp = sortPredicate[i](o1, o2); if (comp !== 0) return comp; } return 0; } - function reverse(comp, descending) { + function reverseComparator(comp, descending) { return toBoolean(descending) ? function(a,b){return comp(b,a);} : comp; @@ -813,7 +811,7 @@ var angularFunction = { * string is string * number is number as string * object is either call $hashKey function on object or assign unique hashKey id. - * + * * @param obj * @returns {String} hash string such that the same input will have the same hash string */ @@ -848,7 +846,7 @@ HashMap.prototype = { this[_key] = value; return oldValue; }, - + /** * @param key * @returns the value for the key @@ -856,7 +854,7 @@ HashMap.prototype = { get: function(key) { return this[hashKey(key)]; }, - + /** * Remove the key/value pair * @param key diff --git a/test/ApiSpecs.js b/test/ApiSpecs.js index 2fd51873..f50f22cd 100644 --- a/test/ApiSpecs.js +++ b/test/ApiSpecs.js @@ -160,15 +160,14 @@ describe('api', function(){ }); describe('orderBy', function(){ - var orderBy = angular.Array.orderBy; - - it('ShouldSortArray', function(){ - assertEquals([2,15], angular.Array.orderBy([15,2])); - assertEquals(["a","B", "c"], angular.Array.orderBy(["c","B", "a"])); - assertEquals([15,"2"], angular.Array.orderBy([15,"2"])); - assertEquals(["15","2"], angular.Array.orderBy(["15","2"])); - assertJsonEquals([{a:2},{a:15}], angular.Array.orderBy([{a:15},{a:2}], 'a')); - assertJsonEquals([{a:2},{a:15}], angular.Array.orderBy([{a:15},{a:2}], 'a', "F")); + var orderBy; + beforeEach(function(){ + orderBy = angular.Array.orderBy; + }); + + it('should return same array if predicate is falsy', function(){ + var array = [1, 2, 3]; + expect(orderBy(array)).toBe(array); }); it('ShouldSortArrayInReverse', function(){ |
