14
14
*
15
15
* Can be one of:
16
16
*
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 `!`.
20
21
*
21
22
* - `Object`: A pattern object can be used to filter specific properties on objects contained
22
23
* by `array`. For example `{name:"M", phone:"1"}` predicate will return an array of items
23
24
* which have property `name` containing "M" and property `phone` containing "1". A special
24
25
* 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`
28
30
* not containing "M".
29
31
*
30
32
* - `function(value, index)`: A predicate function can be used to write arbitrary filters. The
39
41
*
40
42
* - `function(actual, expected)`:
41
43
* 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 .
43
45
*
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.
46
48
*
47
49
* - `false|undefined`: A short hand for a function which will look for a substring match in case
48
50
* insensitive way.
@@ -169,7 +171,7 @@ function createPredicateFn(expression, comparator, matchAgainstAnyProp) {
169
171
return predicateFn ;
170
172
}
171
173
172
- function deepCompare ( actual , expected , comparator , matchAgainstAnyProp ) {
174
+ function deepCompare ( actual , expected , comparator , matchAgainstAnyProp , dontMatchWholeObject ) {
173
175
var actualType = typeof actual ;
174
176
var expectedType = typeof expected ;
175
177
@@ -188,21 +190,21 @@ function deepCompare(actual, expected, comparator, matchAgainstAnyProp) {
188
190
var key ;
189
191
if ( matchAgainstAnyProp ) {
190
192
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 ) ) {
192
194
return true ;
193
195
}
194
196
}
195
- return false ;
197
+ return dontMatchWholeObject ? false : deepCompare ( actual , expected , comparator , false ) ;
196
198
} else if ( expectedType === 'object' ) {
197
199
for ( key in expected ) {
198
200
var expectedVal = expected [ key ] ;
199
201
if ( isFunction ( expectedVal ) ) {
200
202
continue ;
201
203
}
202
204
203
- var keyIsDollar = key === '$' ;
204
- var actualVal = keyIsDollar ? actual : actual [ key ] ;
205
- if ( ! deepCompare ( actualVal , expectedVal , comparator , keyIsDollar ) ) {
205
+ var matchAnyProperty = key === '$' ;
206
+ var actualVal = matchAnyProperty ? actual : actual [ key ] ;
207
+ if ( ! deepCompare ( actualVal , expectedVal , comparator , matchAnyProperty , matchAnyProperty ) ) {
206
208
return false ;
207
209
}
208
210
}
0 commit comments