@@ -17,6 +17,7 @@ export class Encoder {
1717 readonly extensionCodec = ExtensionCodec . defaultCodec ,
1818 readonly maxDepth = DEFAULT_MAX_DEPTH ,
1919 readonly initialBufferSize = DEFAULT_INITIAL_BUFFER_SIZE ,
20+ readonly sortKeys = false ,
2021 ) { }
2122
2223 encode ( object : unknown , depth : number ) : void {
@@ -234,7 +235,11 @@ export class Encoder {
234235 }
235236
236237 encodeMap ( object : Record < string , unknown > , depth : number ) {
237- const size = this . countObjectKeys ( object ) ;
238+ const keys = Object . keys ( object ) ;
239+ if ( this . sortKeys ) {
240+ keys . sort ( ) ;
241+ }
242+ const size = keys . length ;
238243 if ( size < 16 ) {
239244 // fixmap
240245 this . writeU8 ( 0x80 + size ) ;
@@ -249,11 +254,11 @@ export class Encoder {
249254 } else {
250255 throw new Error ( `Too large map object: ${ size } ` ) ;
251256 }
252- for ( const key in object ) {
253- if ( Object . prototype . hasOwnProperty . call ( object , key ) ) {
254- this . encodeString ( key ) ;
255- this . encode ( object [ key ] , depth + 1 ) ;
256- }
257+
258+ for ( let i = 0 ; i < size ; i ++ ) {
259+ const key = keys [ i ] ;
260+ this . encodeString ( key ) ;
261+ this . encode ( object [ key ] , depth + 1 ) ;
257262 }
258263 }
259264
0 commit comments