diff --git a/src/ng/filter/filter.js b/src/ng/filter/filter.js index a739a1ca21c7..c0894389fd9c 100644 --- a/src/ng/filter/filter.js +++ b/src/ng/filter/filter.js @@ -145,6 +145,7 @@ function filterFilter() { // Helper functions for `filterFilter` function createPredicateFn(expression, comparator, matchAgainstAnyProp) { + var shouldMatchPrimitives = isObject(expression) && ('$' in expression); var predicateFn; if (comparator === true) { @@ -163,6 +164,9 @@ function createPredicateFn(expression, comparator, matchAgainstAnyProp) { } predicateFn = function(item) { + if (shouldMatchPrimitives && !isObject(item)) { + return deepCompare(item, expression.$, comparator, false); + } return deepCompare(item, expression, comparator, matchAgainstAnyProp); }; diff --git a/test/ng/filter/filterSpec.js b/test/ng/filter/filterSpec.js index 7e14f5f567f4..bd264927cb12 100644 --- a/test/ng/filter/filterSpec.js +++ b/test/ng/filter/filterSpec.js @@ -65,6 +65,33 @@ describe('Filter: filter', function() { }); + it('should match primitive array values against top-level `$` property in object expression', + function() { + var items, expr; + + items = ['something', 'something else', 'another thing']; + expr = {$: 'some'}; + expect(filter(items, expr).length).toBe(2); + expect(filter(items, expr)).toEqual([items[0], items[1]]); + + items = [{val: 'something'}, {val: 'something else'}, {val: 'another thing'}]; + expr = {$: 'some'}; + expect(filter(items, expr).length).toBe(2); + expect(filter(items, expr)).toEqual([items[0], items[1]]); + + items = [123, 456, 789]; + expr = {$: 1}; + expect(filter(items, expr).length).toBe(1); + expect(filter(items, expr)).toEqual([items[0]]); + + items = [true, false, 'true']; + expr = {$: true, ignored: 'false'}; + expect(filter(items, expr).length).toBe(2); + expect(filter(items, expr)).toEqual([items[0], items[2]]); + } + ); + + it('should take object as predicate', function() { var items = [{first: 'misko', last: 'hevery'}, {first: 'adam', last: 'abrons'}];