@@ -20,7 +20,7 @@ exports.arrayToObject = function (source) {
20
20
} ;
21
21
22
22
23
- exports . clone = function ( source ) {
23
+ exports . clone = function ( source , refs ) {
24
24
25
25
if ( typeof source !== 'object' ||
26
26
source === null ) {
@@ -32,14 +32,24 @@ exports.clone = function (source) {
32
32
return source . toString ( ) ;
33
33
}
34
34
35
- var obj = Array . isArray ( source ) ? [ ] : { } ;
35
+ refs = refs || [ ] ;
36
+
37
+ var lookup = refs . indexOf ( source ) ;
38
+ if ( lookup !== - 1 ) {
39
+ return refs [ lookup ] ;
40
+ }
41
+
42
+ var copy = Array . isArray ( source ) ? [ ] : source ;
43
+
44
+ refs . push ( source ) ;
45
+
36
46
for ( var i in source ) {
37
47
if ( source . hasOwnProperty ( i ) ) {
38
- obj [ i ] = exports . clone ( source [ i ] ) ;
48
+ copy [ i ] = exports . clone ( source [ i ] , refs ) ;
39
49
}
40
50
}
41
51
42
- return obj ;
52
+ return copy ;
43
53
} ;
44
54
45
55
@@ -108,32 +118,41 @@ exports.decode = function (str) {
108
118
} ;
109
119
110
120
111
- exports . compact = function ( obj ) {
121
+ exports . compact = function ( obj , refs ) {
122
+
123
+ if ( typeof obj !== 'object' ||
124
+ obj === null ) {
112
125
113
- if ( typeof obj !== 'object' || obj === null ) {
114
126
return obj ;
115
127
}
116
128
117
- var compacted = { } ;
129
+ refs = refs || [ ] ;
130
+ var lookup = refs . indexOf ( obj ) ;
131
+ if ( lookup !== - 1 ) {
132
+ return refs [ lookup ] ;
133
+ }
118
134
119
- for ( var key in obj ) {
120
- if ( obj . hasOwnProperty ( key ) ) {
121
- if ( Array . isArray ( obj [ key ] ) ) {
122
- compacted [ key ] = [ ] ;
135
+ refs . push ( obj ) ;
123
136
124
- for ( var i = 0 , l = obj [ key ] . length ; i < l ; i ++ ) {
125
- if ( typeof obj [ key ] [ i ] !== 'undefined' ) {
126
- compacted [ key ] . push ( obj [ key ] [ i ] ) ;
127
- }
128
- }
129
- }
130
- else {
131
- compacted [ key ] = exports . compact ( obj [ key ] ) ;
137
+ if ( Array . isArray ( obj ) ) {
138
+ var compacted = [ ] ;
139
+
140
+ for ( var i = 0 , l = obj . length ; i < l ; ++ i ) {
141
+ if ( typeof obj [ i ] !== 'undefined' ) {
142
+ compacted . push ( obj [ i ] ) ;
132
143
}
133
144
}
145
+
146
+ return compacted ;
147
+ }
148
+
149
+ for ( var key in obj ) {
150
+ if ( obj . hasOwnProperty ( key ) ) {
151
+ obj [ key ] = exports . compact ( obj [ key ] , refs ) ;
152
+ }
134
153
}
135
154
136
- return compacted ;
155
+ return obj ;
137
156
} ;
138
157
139
158
0 commit comments