From 99650dece117f3073e1935067aba1ea628863746 Mon Sep 17 00:00:00 2001 From: Sebastien Armand - sa250111 Date: Wed, 19 Feb 2014 15:31:19 +0800 Subject: [PATCH] feat(filter): orderBy for object collections Allows to use orderBy filter on collection objects and not only arrays. Closes: #6210 --- src/ng/filter/orderBy.js | 16 +++++++++++++--- test/ng/filter/orderBySpec.js | 5 +++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/ng/filter/orderBy.js b/src/ng/filter/orderBy.js index b62626988fc5..dbc6290d7893 100644 --- a/src/ng/filter/orderBy.js +++ b/src/ng/filter/orderBy.js @@ -62,9 +62,19 @@ */ orderByFilter.$inject = ['$parse']; function orderByFilter($parse){ - return function(array, sortPredicate, reverseOrder) { - if (!isArray(array)) return array; - if (!sortPredicate) return array; + return function(sortable, sortPredicate, reverseOrder) { + if (!isArray(sortable) && !isObject(sortable)) return sortable; + if (!sortPredicate) return sortable; + var array = sortable; + if(isObject(sortable)) { + array = []; + for (var key in sortable) { + if (sortable.hasOwnProperty(key) && key.charAt(0) != '$') { + array.push(sortable[key]); + } + } + } + sortPredicate = isArray(sortPredicate) ? sortPredicate: [sortPredicate]; sortPredicate = map(sortPredicate, function(predicate){ var descending = false, get = predicate || identity; diff --git a/test/ng/filter/orderBySpec.js b/test/ng/filter/orderBySpec.js index 5c1178910255..955619f8bb34 100644 --- a/test/ng/filter/orderBySpec.js +++ b/test/ng/filter/orderBySpec.js @@ -31,4 +31,9 @@ describe('Filter: orderBy', function() { toEqual([{a:2, b:1},{a:15, b:1}]); }); + it('can sort a hash collection', function() { + expect(orderBy({c: {name: 'c'}, a: {name: 'a'}, b: {name: 'b'}}, 'name')).toEqualData([{name: 'a'}, {name: 'b'}, {name: 'c'}]); + expect(orderBy({c: {name: 'c'}, a: {name: 'a'}, b: {name: 'b'}}, '-name')).toEqualData([{name: 'c'}, {name: 'b'}, {name: 'a'}]); + }); + });