@@ -34,15 +34,17 @@ var pathStateMachine = {
3434 'ws' : [ 'inPath' , 'push' ] ,
3535 '.' : [ 'beforeIdent' , 'push' ] ,
3636 '[' : [ 'beforeElement' , 'push' ] ,
37- 'eof' : [ 'afterPath' , 'push' ]
37+ 'eof' : [ 'afterPath' , 'push' ] ,
38+ ']' : [ 'inPath' , 'push' ]
3839 } ,
3940
4041 'beforeElement' : {
4142 'ws' : [ 'beforeElement' ] ,
4243 '0' : [ 'afterZero' , 'append' ] ,
4344 'number' : [ 'inIndex' , 'append' ] ,
4445 "'" : [ 'inSingleQuote' , 'append' , '' ] ,
45- '"' : [ 'inDoubleQuote' , 'append' , '' ]
46+ '"' : [ 'inDoubleQuote' , 'append' , '' ] ,
47+ "ident" : [ 'inIdent' , 'append' , '*' ]
4648 } ,
4749
4850 'afterZero' : {
@@ -189,9 +191,12 @@ function parsePath (path) {
189191
190192 mode = transition [ 0 ]
191193 action = actions [ transition [ 1 ] ] || noop
192- newChar = transition [ 2 ] === undefined
194+ newChar = transition [ 2 ]
195+ newChar = newChar === undefined
193196 ? c
194- : transition [ 2 ]
197+ : newChar === '*'
198+ ? newChar + c
199+ : newChar
195200 action ( )
196201
197202 if ( mode === 'afterPath' ) {
@@ -207,11 +212,13 @@ function parsePath (path) {
207212 * @return {Boolean }
208213 */
209214
210- function formatAccessor ( key ) {
215+ function formatAccessor ( key ) {
211216 if ( identRE . test ( key ) ) { // identifier
212217 return '.' + key
213218 } else if ( + key === key >>> 0 ) { // bracket index
214219 return '[' + key + ']'
220+ } else if ( key . charAt ( 0 ) === '*' ) {
221+ return '[o' + formatAccessor ( key . slice ( 1 ) ) + ']'
215222 } else { // bracket string
216223 return '["' + key . replace ( / " / g, '\\"' ) + '"]'
217224 }
@@ -272,27 +279,33 @@ exports.get = function (obj, path) {
272279 */
273280
274281exports . set = function ( obj , path , val ) {
282+ var original = obj
275283 if ( typeof path === 'string' ) {
276284 path = exports . parse ( path )
277285 }
278286 if ( ! path || ! _ . isObject ( obj ) ) {
279287 return false
280288 }
281289 var last , key
282- for ( var i = 0 , l = path . length - 1 ; i < l ; i ++ ) {
290+ for ( var i = 0 , l = path . length ; i < l ; i ++ ) {
283291 last = obj
284292 key = path [ i ]
285- obj = obj [ key ]
286- if ( ! _ . isObject ( obj ) ) {
287- obj = { }
288- last . $add ( key , obj )
293+ if ( key . charAt ( 0 ) === '*' ) {
294+ key = original [ key . slice ( 1 ) ]
295+ }
296+ if ( i < l - 1 ) {
297+ obj = obj [ key ]
298+ if ( ! _ . isObject ( obj ) ) {
299+ obj = { }
300+ last . $add ( key , obj )
301+ }
302+ } else {
303+ if ( key in obj ) {
304+ obj [ key ] = val
305+ } else {
306+ obj . $add ( key , val )
307+ }
289308 }
290- }
291- key = path [ i ]
292- if ( key in obj ) {
293- obj [ key ] = val
294- } else {
295- obj . $add ( key , val )
296309 }
297310 return true
298311}
0 commit comments