1- /*
2- ISC License
3-
4- Copyright 2021, Saksham Khurana (DawnImpulse)
5-
6- Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted,
7- provided that the above copyright notice and this permission notice appear in all copies.
8-
9- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
10- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
12- WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
13- OR PERFORMANCE OF THIS SOFTWARE.
14- */
15-
16- // ----- PRIVATE -----
17-
181/**
192 * Used to check if data type is json or not
203 * @param data
@@ -35,11 +18,11 @@ const typeOf = function (data) {
3518 }
3619} ;
3720
38- // ------ EXPORT -----
21+ // ------ PUBLIC FUNCTIONS -----
3922
4023/**
4124 * json sorting based on keys
42- * > considering data is a json object only (not array or any thing else)
25+ * > considering data is a json object only (not array or anything else)
4326 * @param data - json to be sorted
4427 * @param sort - asc (true) / desc (false)
4528 * @return {{} } - a sorted json object
@@ -50,28 +33,15 @@ function jsonSort(data, sort) {
5033 let newData = [ ] ;
5134 for ( let w = 0 ; w < data . length ; w ++ ) {
5235 let d = data [ w ] ;
53- if ( typeOf ( d ) === "OBJECT" || typeOf ( d ) === "ARRAY" )
54- newData . push ( jsonSort ( d , sort ) ) ;
55- else {
56- newData . push ( d )
57- }
36+ if ( typeOf ( d ) === "OBJECT" || typeOf ( d ) === "ARRAY" ) newData . push ( jsonSort ( d , sort ) ) ;
37+ else newData . push ( d )
5838 }
5939 return newData
60- } else if ( typeOf ( data ) === "OBJECT" ) {
61- let newKeys = [ ] ,
62- keys ,
63- newData = { } ;
40+ } else if ( typeOf ( data ) === "OBJECT" ) {
41+ let keys = Object . keys ( data ) . sort ( ) , newData = { } ;
6442
65- if ( sort === undefined )
66- sort = true ;
67-
68- keys = Object . keys ( data ) . sort ( ) ;
69-
70- if ( ! sort ) {
71- for ( let i = keys . length - 1 ; i >= 0 ; i -- )
72- newKeys . push ( keys [ i ] )
73- keys = newKeys
74- }
43+ if ( sort === undefined ) sort = true ;
44+ if ( ! sort ) keys = keys . reverse ( ) ;
7545
7646 for ( let j = 0 ; j < keys . length ; j ++ ) {
7747 let key = keys [ j ] ;
@@ -91,26 +61,55 @@ function jsonSort(data, sort) {
9161 }
9262
9363 return newData
94- }
95- else
64+ } else
9665 throw new Error ( "must be an object/array" )
9766}
9867
9968/**
100- * just like normal sort but returns promise
69+ * Truly async version that yields to event loop during iterations
10170 * @param data - json to be sorted
10271 * @param sort - asc (true) / desc (false)
10372 * @return Promise - promise of sorted json object
10473 */
105- async function jsonSortAsync ( data , sort ) {
106- return new Promise ( ( resolve , reject ) => {
107- try {
108- const response = jsonSort ( data , sort )
109- resolve ( response )
110- } catch ( e ) {
111- reject ( e )
74+ async function jsonSortAsync ( data , sort ) {
75+ if ( typeOf ( data ) === "ARRAY" ) {
76+ let newData = [ ] ;
77+ for ( let w = 0 ; w < data . length ; w ++ ) {
78+ await new Promise ( resolve => process . nextTick ( resolve ) ) ;
79+ let d = data [ w ] ;
80+ if ( typeOf ( d ) === "OBJECT" || typeOf ( d ) === "ARRAY" )
81+ newData . push ( await jsonSortAsync ( d , sort ) ) ;
82+ else
83+ newData . push ( d ) ;
84+ }
85+ return newData ;
86+ } else if ( typeOf ( data ) === "OBJECT" ) {
87+ let keys = Object . keys ( data ) . sort ( ) , newData = { } ;
88+
89+ if ( sort === undefined ) sort = true ;
90+ if ( ! sort ) keys = keys . reverse ( ) ;
91+
92+ for ( let j = 0 ; j < keys . length ; j ++ ) {
93+ await new Promise ( resolve => process . nextTick ( resolve ) ) ;
94+ let key = keys [ j ] ;
95+ if ( typeOf ( data [ key ] ) === "OBJECT" )
96+ newData [ key ] = await jsonSortAsync ( data [ key ] , sort ) ;
97+ else if ( typeOf ( data [ key ] ) === "ARRAY" ) {
98+ newData [ key ] = [ ] ;
99+ for ( let k = 0 ; k < data [ key ] . length ; k ++ ) {
100+ await new Promise ( resolve => process . nextTick ( resolve ) ) ;
101+ let d = data [ key ] [ k ] ;
102+ if ( typeOf ( d ) === "OBJECT" || typeOf ( d ) === "ARRAY" )
103+ newData [ key ] . push ( await jsonSortAsync ( data [ key ] [ k ] , sort ) ) ;
104+ else
105+ newData [ key ] . push ( data [ key ] [ k ] ) ;
106+ }
107+ } else
108+ newData [ key ] = data [ key ] ;
112109 }
113- } )
110+ return newData ;
111+ } else
112+ throw new Error ( "must be an object/array" ) ;
114113}
115114
116115// exporting with name as sort
0 commit comments