@@ -120,7 +120,6 @@ function filterFilter() {
120
120
if ( ! isArray ( array ) ) return array ;
121
121
122
122
var predicateFn ;
123
- var matchAgainstAnyProp ;
124
123
125
124
switch ( typeof expression ) {
126
125
case 'function' :
@@ -129,11 +128,8 @@ function filterFilter() {
129
128
case 'boolean' :
130
129
case 'number' :
131
130
case 'string' :
132
- matchAgainstAnyProp = true ;
133
- //jshint -W086
134
131
case 'object' :
135
- //jshint +W086
136
- predicateFn = createPredicateFn ( expression , comparator , matchAgainstAnyProp ) ;
132
+ predicateFn = createPredicateFn ( expression , comparator ) ;
137
133
break ;
138
134
default :
139
135
return array ;
@@ -144,7 +140,7 @@ function filterFilter() {
144
140
}
145
141
146
142
// Helper functions for `filterFilter`
147
- function createPredicateFn ( expression , comparator , matchAgainstAnyProp ) {
143
+ function createPredicateFn ( expression , comparator ) {
148
144
var predicateFn ;
149
145
150
146
if ( comparator === true ) {
@@ -163,53 +159,58 @@ function createPredicateFn(expression, comparator, matchAgainstAnyProp) {
163
159
}
164
160
165
161
predicateFn = function ( item ) {
166
- return deepCompare ( item , expression , comparator , matchAgainstAnyProp ) ;
162
+ return deepCompare ( item , expression , comparator ) ;
167
163
} ;
168
164
169
165
return predicateFn ;
170
166
}
171
167
172
- function deepCompare ( actual , expected , comparator , matchAgainstAnyProp , temporaryAnyProp ) {
168
+ function deepCompare ( actual , expected , comparator ) {
173
169
var actualType = typeof actual ;
174
170
var expectedType = typeof expected ;
175
- var nextMatchAgainstAnyProp = matchAgainstAnyProp && ! temporaryAnyProp ;
176
171
177
172
if ( ( expectedType === 'string' ) && ( expected . charAt ( 0 ) === '!' ) ) {
178
- return ! deepCompare ( actual , expected . substring ( 1 ) , comparator , nextMatchAgainstAnyProp ) ;
179
- } else if ( actualType === 'array' ) {
173
+ return ! deepCompare ( actual , expected . substring ( 1 ) , comparator ) ;
174
+ }
175
+
176
+ if ( actualType === 'array' ) {
180
177
// In case `actual` is an array, consider it a match
181
178
// if ANY of it's items matches `expected`
182
179
return actual . some ( function ( item ) {
183
- return deepCompare ( item , expected , comparator , nextMatchAgainstAnyProp ) ;
180
+ return deepCompare ( item , expected , comparator ) ;
184
181
} ) ;
185
182
}
186
183
187
184
switch ( actualType ) {
188
185
case 'object' :
189
186
var key ;
190
- if ( matchAgainstAnyProp ) {
191
- for ( key in actual ) {
192
- if ( ( key . charAt ( 0 ) !== '$' ) && deepCompare ( actual [ key ] , expected , comparator , nextMatchAgainstAnyProp ) ) {
193
- return true ;
194
- }
195
- }
196
- return false ;
197
- } else if ( expectedType === 'object' ) {
187
+ if ( expectedType === 'object' ) {
198
188
for ( key in expected ) {
199
189
var expectedVal = expected [ key ] ;
200
190
if ( isFunction ( expectedVal ) ) {
201
191
continue ;
202
192
}
203
193
204
194
var keyIsDollar = key === '$' ;
205
- var actualVal = keyIsDollar ? actual : actual [ key ] ;
206
- if ( ! deepCompare ( actualVal , expectedVal , comparator , keyIsDollar , keyIsDollar ) ) {
207
- return false ;
195
+ if ( keyIsDollar ) {
196
+ if ( ! matchAnyProp ( actual , expectedVal , comparator ) ) {
197
+ return false ;
198
+ }
199
+ } else {
200
+ var actualVal = actual [ key ] ;
201
+ if ( ! deepCompare ( actualVal , expectedVal , comparator ) ) {
202
+ return false ;
203
+ }
208
204
}
209
205
}
210
206
return true ;
211
207
} else {
212
- return comparator ( actual , expected ) ;
208
+ for ( key in actual ) {
209
+ if ( ( key . charAt ( 0 ) !== '$' ) && deepCompare ( actual [ key ] , expected , comparator ) ) {
210
+ return true ;
211
+ }
212
+ }
213
+ return false ;
213
214
}
214
215
break ;
215
216
case 'function' :
@@ -218,3 +219,16 @@ function deepCompare(actual, expected, comparator, matchAgainstAnyProp, temporar
218
219
return comparator ( actual , expected ) ;
219
220
}
220
221
}
222
+
223
+ function matchAnyProp ( actual , expected , comparator ) {
224
+ if ( typeof actual !== 'object' ) {
225
+ throw new Error ( 'actual must be an object but was ' + typeof actual ) ;
226
+ }
227
+
228
+ for ( var key in actual ) {
229
+ if ( deepCompare ( actual [ key ] , expected , comparator ) ) {
230
+ return true ;
231
+ }
232
+ }
233
+ return false ;
234
+ }
0 commit comments