1414 *
1515 * Can be one of:
1616 *
17- * - `string`: The string is evaluated as an expression and the resulting value is used for substring match against
18- * the contents of the `array`. All strings or objects with string properties in `array` that contain this string
19- * will be returned. The predicate can be negated by prefixing the string with `!`.
17+ * - `string`: The string is used for matching against the contents of the `array`. All strings or
18+ * objects with string properties in `array` that match this string will be returned. This also
19+ * applies to nested object properties.
20+ * The predicate can be negated by prefixing the string with `!`.
2021 *
2122 * - `Object`: A pattern object can be used to filter specific properties on objects contained
2223 * by `array`. For example `{name:"M", phone:"1"}` predicate will return an array of items
2324 * which have property `name` containing "M" and property `phone` containing "1". A special
2425 * property name `$` can be used (as in `{$:"text"}`) to accept a match against any
25- * property of the object. That's equivalent to the simple substring match with a `string`
26- * as described above. The predicate can be negated by prefixing the string with `!`.
27- * For Example `{name: "!M"}` predicate will return an array of items which have property `name`
26+ * property of the object or its nested object properties. That's equivalent to the simple
27+ * substring match with a `string` as described above. The predicate can be negated by prefixing
28+ * the string with `!`.
29+ * For example `{name: "!M"}` predicate will return an array of items which have property `name`
2830 * not containing "M".
2931 *
3032 * - `function(value, index)`: A predicate function can be used to write arbitrary filters. The
3941 *
4042 * - `function(actual, expected)`:
4143 * The function will be given the object value and the predicate value to compare and
42- * should return true if the item should be included in filtered result .
44+ * should return true if both values should be considered equal .
4345 *
44- * - `true`: A shorthand for `function(actual, expected) { return angular.equals(expected, actual )}`.
45- * this is essentially strict comparison of expected and actual.
46+ * - `true`: A shorthand for `function(actual, expected) { return angular.equals(actual, expected )}`.
47+ * This is essentially strict comparison of expected and actual.
4648 *
4749 * - `false|undefined`: A short hand for a function which will look for a substring match in case
4850 * insensitive way.
@@ -169,7 +171,7 @@ function createPredicateFn(expression, comparator, matchAgainstAnyProp) {
169171 return predicateFn ;
170172}
171173
172- function deepCompare ( actual , expected , comparator , matchAgainstAnyProp ) {
174+ function deepCompare ( actual , expected , comparator , matchAgainstAnyProp , dontMatchWholeObject ) {
173175 var actualType = typeof actual ;
174176 var expectedType = typeof expected ;
175177
@@ -188,11 +190,11 @@ function deepCompare(actual, expected, comparator, matchAgainstAnyProp) {
188190 var key ;
189191 if ( matchAgainstAnyProp ) {
190192 for ( key in actual ) {
191- if ( ( key . charAt ( 0 ) !== '$' ) && deepCompare ( actual [ key ] , expected , comparator ) ) {
193+ if ( ( key . charAt ( 0 ) !== '$' ) && deepCompare ( actual [ key ] , expected , comparator , true ) ) {
192194 return true ;
193195 }
194196 }
195- return false ;
197+ return dontMatchWholeObject ? false : deepCompare ( actual , expected , comparator , false ) ;
196198 } else if ( expectedType === 'object' ) {
197199 for ( key in expected ) {
198200 var expectedVal = expected [ key ] ;
@@ -202,7 +204,7 @@ function deepCompare(actual, expected, comparator, matchAgainstAnyProp) {
202204
203205 var keyIsDollar = key === '$' ;
204206 var actualVal = keyIsDollar ? actual : actual [ key ] ;
205- if ( ! deepCompare ( actualVal , expectedVal , comparator , keyIsDollar ) ) {
207+ if ( ! deepCompare ( actualVal , expectedVal , comparator , keyIsDollar , keyIsDollar ) ) {
206208 return false ;
207209 }
208210 }
0 commit comments