From 896250484904732889ee590e95eb092becec9bdc Mon Sep 17 00:00:00 2001 From: Caitlin Potter Date: Tue, 11 Feb 2014 09:57:04 -0500 Subject: [PATCH] feat(filterFilter): support deeply nested predicate objects Due to 339a165, it became impossible to filter nested properties of an object using the filterFilter. A proposed solution to this was to enable the use of nested predicate objects. This change enables the use of these nested predicate objects. Example: ```html
``` Or ```js $filter('filter')(items, { address: { country: 'Canuckistan' } }); ``` Closes #6215 Related to #6009 --- src/Angular.js | 3 ++- src/ng/filter/filter.js | 9 +++++++++ test/ng/filter/filterSpec.js | 11 +++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/Angular.js b/src/Angular.js index f4054037110b..405e8ae561ab 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -81,6 +81,7 @@ -assertNotHasOwnProperty, -getter, -getBlockElements, + -hasOwnProperty, */ @@ -96,7 +97,7 @@ * @returns {string} Lowercased string. */ var lowercase = function(string){return isString(string) ? string.toLowerCase() : string;}; - +var hasOwnProperty = Object.prototype.hasOwnProperty; /** * @ngdoc function diff --git a/src/ng/filter/filter.js b/src/ng/filter/filter.js index eabe84a7e0b0..2bb0d1743949 100644 --- a/src/ng/filter/filter.js +++ b/src/ng/filter/filter.js @@ -136,6 +136,15 @@ function filterFilter() { }; } else { comparator = function(obj, text) { + if (obj && text && typeof obj === 'object' && typeof text === 'object') { + for (var objKey in obj) { + if (objKey.charAt(0) !== '$' && hasOwnProperty.call(obj, objKey) && + comparator(obj[objKey], text[objKey])) { + return true; + } + } + return false; + } text = (''+text).toLowerCase(); return (''+obj).toLowerCase().indexOf(text) > -1; }; diff --git a/test/ng/filter/filterSpec.js b/test/ng/filter/filterSpec.js index 0bb487042ba3..7679136ac9f9 100644 --- a/test/ng/filter/filterSpec.js +++ b/test/ng/filter/filterSpec.js @@ -70,6 +70,17 @@ describe('Filter: filter', function() { }); + it('should support deep predicate objects', function() { + var items = [{person: {name: 'John'}}, + {person: {name: 'Rita'}}, + {person: {name: 'Billy'}}, + {person: {name: 'Joan'}}]; + expect(filter(items, {person: {name: 'Jo'}}).length).toBe(2); + expect(filter(items, {person: {name: 'Jo'}})).toEqual([ + {person: {name: 'John'}}, {person: {name: 'Joan'}}]); + }); + + it('should match any properties for given "$" property', function() { var items = [{first: 'tom', last: 'hevery'}, {first: 'adam', last: 'hevery', alias: 'tom', done: false},