@@ -352,33 +352,28 @@ JSONPath.prototype._trace = function (
352
352
hasArrExpr ) ) ;
353
353
// eslint-disable-next-line unicorn/prefer-switch -- Part of larger `if`
354
354
} else if ( loc === '*' ) { // all child properties
355
- this . _walk (
356
- loc , x , val , path , parent , parentPropName , callback ,
357
- ( m , l , _x , v , p , par , pr , cb ) => {
358
- addRet ( this . _trace ( unshift ( m , _x ) , v , p , par , pr , cb ,
359
- true , true ) ) ;
360
- }
361
- ) ;
355
+ this . _walk ( val , ( m ) => {
356
+ addRet ( this . _trace (
357
+ x , val [ m ] , push ( path , m ) , val , m , callback , true , true
358
+ ) ) ;
359
+ } ) ;
362
360
} else if ( loc === '..' ) { // all descendent parent properties
363
361
// Check remaining expression with val's immediate children
364
362
addRet (
365
363
this . _trace ( x , val , path , parent , parentPropName , callback ,
366
364
hasArrExpr )
367
365
) ;
368
- this . _walk (
369
- loc , x , val , path , parent , parentPropName , callback ,
370
- ( m , l , _x , v , p , par , pr , cb ) => {
371
- // We don't join m and x here because we only want parents,
372
- // not scalar values
373
- if ( typeof v [ m ] === 'object' ) {
374
- // Keep going with recursive descent on val's
375
- // object children
376
- addRet ( this . _trace (
377
- unshift ( l , _x ) , v [ m ] , push ( p , m ) , v , m , cb , true
378
- ) ) ;
379
- }
366
+ this . _walk ( val , ( m ) => {
367
+ // We don't join m and x here because we only want parents,
368
+ // not scalar values
369
+ if ( typeof val [ m ] === 'object' ) {
370
+ // Keep going with recursive descent on val's
371
+ // object children
372
+ addRet ( this . _trace (
373
+ expr . slice ( ) , val [ m ] , push ( path , m ) , val , m , callback , true
374
+ ) ) ;
380
375
}
381
- ) ;
376
+ } ) ;
382
377
// The parent sel computation is handled in the frame above using the
383
378
// ancestor object of val
384
379
} else if ( loc === '^' ) {
@@ -408,15 +403,13 @@ JSONPath.prototype._trace = function (
408
403
if ( this . currPreventEval ) {
409
404
throw new Error ( 'Eval [?(expr)] prevented in JSONPath expression.' ) ;
410
405
}
411
- this . _walk (
412
- loc , x , val , path , parent , parentPropName , callback ,
413
- ( m , l , _x , v , p , par , pr , cb ) => {
414
- if ( this . _eval ( l . replace ( / ^ \? \( ( .* ?) \) $ / u, '$1' ) , v [ m ] , m , p , par , pr ) ) {
415
- addRet ( this . _trace ( unshift ( m , _x ) , v , p , par , pr , cb ,
416
- true ) ) ;
417
- }
406
+ const safeLoc = loc . replace ( / ^ \? \( ( .* ?) \) $ / u, '$1' ) ;
407
+ this . _walk ( val , ( m ) => {
408
+ if ( this . _eval ( safeLoc , val [ m ] , m , path , parent , parentPropName ) ) {
409
+ addRet ( this . _trace ( x , val [ m ] , push ( path , m ) , val , m , callback ,
410
+ true ) ) ;
418
411
}
419
- ) ;
412
+ } ) ;
420
413
} else if ( loc [ 0 ] === '(' ) { // [(expr)] (dynamic property/index)
421
414
if ( this . currPreventEval ) {
422
415
throw new Error ( 'Eval [(expr)] prevented in JSONPath expression.' ) ;
@@ -543,17 +536,15 @@ JSONPath.prototype._trace = function (
543
536
return ret ;
544
537
} ;
545
538
546
- JSONPath . prototype . _walk = function (
547
- loc , expr , val , path , parent , parentPropName , callback , f
548
- ) {
539
+ JSONPath . prototype . _walk = function ( val , f ) {
549
540
if ( Array . isArray ( val ) ) {
550
541
const n = val . length ;
551
542
for ( let i = 0 ; i < n ; i ++ ) {
552
- f ( i , loc , expr , val , path , parent , parentPropName , callback ) ;
543
+ f ( i ) ;
553
544
}
554
545
} else if ( val && typeof val === 'object' ) {
555
546
Object . keys ( val ) . forEach ( ( m ) => {
556
- f ( m , loc , expr , val , path , parent , parentPropName , callback ) ;
547
+ f ( m ) ;
557
548
} ) ;
558
549
}
559
550
} ;
0 commit comments