@@ -23,7 +23,9 @@ declare global {
2323
2424 interface Array < T > {
2525 groupBy < K extends string | number > ( this : Array < T > , keySelector : ( element : T ) => K ) : { key : K ; elements : T [ ] } [ ] ;
26+ groupBy < K extends string | number , E > ( this : Array < T > , keySelector : ( element : T ) => K , elementSelector : ( element : T ) => E ) : { key : K ; elements : E [ ] } [ ] ;
2627 groupToObject ( this : Array < T > , keySelector : ( element : T ) => string ) : { [ key : string ] : T [ ] } ;
28+ groupToObject < E > ( this : Array < T > , keySelector : ( element : T ) => string , elementSelector : ( element : T ) => E ) : { [ key : string ] : E [ ] } ;
2729 groupWhen ( this : Array < T > , condition : ( element : T ) => boolean , includeKeyInGroup ?: boolean , initialGroup ?: boolean ) : { key : T , elements : T [ ] } [ ] ;
2830 groupWhenChange < K extends string | number > ( this : Array < T > , keySelector : ( element : T ) => K ) : { key : K , elements : T [ ] } [ ] ;
2931
@@ -137,25 +139,25 @@ Array.prototype.clear = function (): void {
137139 this . length = 0 ;
138140} ;
139141
140- Array . prototype . groupBy = function ( this : any [ ] , keySelector : ( element : any ) => string | number ) : { key : any /*string*/ ; elements : any [ ] } [ ] {
142+ Array . prototype . groupBy = function ( this : any [ ] , keySelector : ( element : any ) => string | number , elementSelector ?: ( element : any ) => unknown ) : { key : any /*string*/ ; elements : any [ ] } [ ] {
141143 const result : { key : string | number ; elements : any [ ] } [ ] = [ ] ;
142- const objectGrouped = this . groupToObject ( keySelector as ( ( element : any ) => string ) ) ;
144+ const objectGrouped = this . groupToObject ( keySelector as ( ( element : any ) => string ) , elementSelector ! ) ;
143145 for ( const prop in objectGrouped ) {
144146 if ( objectGrouped . hasOwnProperty ( prop ) )
145147 result . push ( { key : prop , elements : objectGrouped [ prop ] } ) ;
146148 }
147149 return result ;
148150} ;
149151
150- Array . prototype . groupToObject = function ( this : any [ ] , keySelector : ( element : any ) => string ) : { [ key : string ] : any [ ] } {
152+ Array . prototype . groupToObject = function ( this : any [ ] , keySelector : ( element : any ) => string , elementSelector ?: ( element : any ) => unknown ) : { [ key : string ] : any [ ] } {
151153 const result : { [ key : string ] : any [ ] } = { } ;
152154
153155 for ( let i = 0 ; i < this . length ; i ++ ) {
154156 const element : any = this [ i ] ;
155157 const key = keySelector ( element ) ;
156158 if ( ! result [ key ] )
157159 result [ key ] = [ ] ;
158- result [ key ] . push ( element ) ;
160+ result [ key ] . push ( elementSelector ? elementSelector ( element ) : element ) ;
159161 }
160162 return result ;
161163} ;
0 commit comments