@@ -141,9 +141,10 @@ function findMostFrequent(arr: Call[]) {
141
141
142
142
return maxItem ;
143
143
}
144
- export function computeLevels ( calls : Call [ ] , nodeList : Node [ ] , levels : any [ ] ) {
144
+ export function computeLevels ( calls : Call [ ] , nodeList : Node [ ] , arr : Node [ ] [ ] ) {
145
+ const levels : Node [ ] [ ] = [ ] ;
145
146
const node = findMostFrequent ( calls ) ;
146
- const nodes = JSON . parse ( JSON . stringify ( nodeList ) ) . sort ( ( a : Node , b : Node ) => {
147
+ let nodes = JSON . parse ( JSON . stringify ( nodeList ) ) . sort ( ( a : Node , b : Node ) => {
147
148
if ( a . name . toLowerCase ( ) < b . name . toLowerCase ( ) ) {
148
149
return - 1 ;
149
150
}
@@ -158,23 +159,23 @@ export function computeLevels(calls: Call[], nodeList: Node[], levels: any[]) {
158
159
key = nodes . findIndex ( ( n : Node ) => n . id === node . id ) ;
159
160
}
160
161
levels . push ( [ nodes [ key ] ] ) ;
161
- nodes . splice ( key , 1 ) ;
162
+ nodes = nodes . filter ( ( _ : unknown , index : number ) => index !== key ) ;
162
163
for ( const level of levels ) {
163
164
const a = [ ] ;
164
165
for ( const l of level ) {
165
166
for ( const n of calls ) {
166
167
if ( n . target === l . id ) {
167
168
const i = nodes . findIndex ( ( d : Node ) => d . id === n . source ) ;
168
- if ( i > - 1 ) {
169
+ if ( i > - 1 && nodes [ i ] ) {
169
170
a . push ( nodes [ i ] ) ;
170
- nodes . splice ( i , 1 ) ;
171
+ nodes = nodes . filter ( ( _ : unknown , index : number ) => index !== i ) ;
171
172
}
172
173
}
173
174
if ( n . source === l . id ) {
174
175
const i = nodes . findIndex ( ( d : Node ) => d . id === n . target ) ;
175
- if ( i > - 1 ) {
176
+ if ( i > - 1 && nodes [ i ] ) {
176
177
a . push ( nodes [ i ] ) ;
177
- nodes . splice ( i , 1 ) ;
178
+ nodes = nodes . filter ( ( _ : unknown , index : number ) => index !== i ) ;
178
179
}
179
180
}
180
181
}
@@ -183,13 +184,22 @@ export function computeLevels(calls: Call[], nodeList: Node[], levels: any[]) {
183
184
levels . push ( a ) ;
184
185
}
185
186
}
187
+ const list = levels . length > arr . length ? levels : arr ;
188
+ const subList = levels . length > arr . length ? arr : levels ;
189
+ arr = list . map ( ( subArray : Node [ ] , index : number ) => {
190
+ if ( subList [ index ] ) {
191
+ return subArray . concat ( subList [ index ] ) ;
192
+ } else {
193
+ return subArray ;
194
+ }
195
+ } ) ;
196
+
186
197
if ( nodes . length ) {
187
198
const ids = nodes . map ( ( d : Node ) => d . id ) ;
188
199
const links = calls . filter ( ( item : Call ) => ids . includes ( item . source ) || ids . includes ( item . target ) ) ;
189
- const list = computeLevels ( links , nodes , [ ] ) ;
190
- levels = list . map ( ( subArrayA , index ) => subArrayA . concat ( levels [ index ] ) ) ;
200
+ arr = computeLevels ( links , nodes , arr ) ;
191
201
}
192
- return levels ;
202
+ return arr ;
193
203
}
194
204
export function changeNode ( d : { x : number ; y : number } , currentNode : Nullable < Node > , layout : any , radius : number ) {
195
205
if ( ! currentNode ) {
@@ -229,7 +239,7 @@ export function changeNode(d: { x: number; y: number }, currentNode: Nullable<No
229
239
}
230
240
export function hierarchy ( levels : Node [ ] [ ] , calls : Call [ ] , radius : number ) {
231
241
// precompute level depth
232
- levels . forEach ( ( l : Node [ ] , i : number ) => l . forEach ( ( n : any ) => n && ( n . level = i ) ) ) ;
242
+ levels . forEach ( ( l : Node [ ] , i : number ) => l . forEach ( ( n : Node ) => n && ( n . level = i ) ) ) ;
233
243
234
244
const nodes : Node [ ] = levels . reduce ( ( a , x ) => a . concat ( x ) , [ ] ) ;
235
245
// layout
0 commit comments