@@ -107,25 +107,27 @@ function crawl(objIn, objOut, schema, list, path) {
107
107
var valIn = objIn [ k ] ,
108
108
valOut = objOut [ k ] ;
109
109
110
- if ( isPlainObject ( valIn ) && isPlainObject ( valOut ) ) {
111
- crawl ( valIn , valOut , schema [ k ] , list , p ) ;
112
- }
113
- else if ( ! ( k in schema ) ) {
110
+ var nestedSchema = getNestedSchema ( schema , k ) ;
111
+
112
+ if ( ! isInSchema ( schema , k ) ) {
114
113
list . push ( format ( 'schema' , p ) ) ;
115
114
}
116
- else if ( schema [ k ] . items && Array . isArray ( valIn ) ) {
115
+ else if ( isPlainObject ( valIn ) && isPlainObject ( valOut ) ) {
116
+ crawl ( valIn , valOut , nestedSchema , list , p ) ;
117
+ }
118
+ else if ( nestedSchema . items && Array . isArray ( valIn ) ) {
117
119
var itemName = k . substr ( 0 , k . length - 1 ) ;
118
120
119
121
for ( var j = 0 ; j < valIn . length ; j ++ ) {
120
122
p [ p . length - 1 ] = k + '[' + j + ']' ;
121
123
122
- crawl ( valIn [ j ] , valOut [ j ] , schema [ k ] . items [ itemName ] , list , p ) ;
124
+ crawl ( valIn [ j ] , valOut [ j ] , nestedSchema . items [ itemName ] , list , p ) ;
123
125
}
124
126
}
125
127
else if ( ! ( k in objOut ) ) {
126
128
list . push ( format ( 'unused' , p , valIn ) ) ;
127
129
}
128
- else if ( ! Lib . validate ( valIn , schema [ k ] ) ) {
130
+ else if ( ! Lib . validate ( valIn , nestedSchema ) ) {
129
131
list . push ( format ( 'value' , p , valIn ) ) ;
130
132
}
131
133
}
@@ -154,3 +156,33 @@ function format(code, path, valIn) {
154
156
msg : code2msgFunc [ code ] ( path , valIn )
155
157
} ;
156
158
}
159
+
160
+ function isInSchema ( schema , key ) {
161
+ var parts = splitKey ( key ) ,
162
+ keyMinusId = parts . keyMinusId ,
163
+ id = parts . id ;
164
+
165
+ if ( ( keyMinusId in schema ) && schema [ keyMinusId ] . _isSubplotObj && id ) {
166
+ return true ;
167
+ }
168
+
169
+ return ( key in schema ) ;
170
+ }
171
+
172
+ function getNestedSchema ( schema , key ) {
173
+ var parts = splitKey ( key ) ;
174
+
175
+ return schema [ parts . keyMinusId ] ;
176
+ }
177
+
178
+ function splitKey ( key ) {
179
+ var idRegex = / ( [ 2 - 9 ] | [ 1 - 9 ] [ 0 - 9 ] + ) $ / ;
180
+
181
+ var keyMinusId = key . split ( idRegex ) [ 0 ] ,
182
+ id = key . substr ( keyMinusId . length , key . length ) ;
183
+
184
+ return {
185
+ keyMinusId : keyMinusId ,
186
+ id : id
187
+ } ;
188
+ }
0 commit comments