1
1
'use strict' ;
2
2
var util = require ( 'util' ) ;
3
3
4
- function createTree ( list , rootNodes , customID ) {
4
+ var exists = function ( obj , key ) {
5
+ return obj != null && Object . hasOwnProperty . call ( obj , key ) ;
6
+ } ;
7
+
8
+ var createTree = function ( array , rootNodes , customID ) {
5
9
var tree = [ ] ;
6
10
7
- for ( var prop in rootNodes ) {
8
- if ( ! rootNodes . hasOwnProperty ( prop ) ) {
9
- continue ;
11
+ for ( var key in rootNodes ) {
12
+ if ( ! exists ( rootNodes , key ) ) {
13
+ continue ;
10
14
}
15
+ var parentNode = rootNodes [ key ] ;
16
+ var childNode = array [ parentNode [ customID ] ] ;
11
17
12
- var node = rootNodes [ prop ] ;
13
- var listItem = list [ node [ customID ] ] ;
14
-
15
- if ( listItem ) {
16
- node . children = createTree ( list , listItem , customID ) ;
18
+ if ( childNode ) {
19
+ parentNode . children = createTree ( array , childNode , customID ) ;
17
20
}
18
21
19
- tree . push ( node ) ;
22
+ tree . push ( parentNode ) ;
20
23
}
21
24
22
25
return tree ;
23
- }
26
+ } ;
24
27
25
- function orderByParents ( list , config ) {
28
+ var groupByParents = function ( array , options ) {
26
29
var parents = { } ;
27
- var parentProperty = config . parentProperty ;
30
+ var parentProperty = options . parentProperty ;
28
31
29
- list . forEach ( function ( item ) {
30
- var parentID = item [ parentProperty ] || 0 ;
31
- parents [ parentID ] = parents [ parentID ] || [ ] ;
32
- parents [ parentID ] . push ( item ) ;
32
+ array . forEach ( function ( item ) {
33
+ var parentID = item [ parentProperty ] || options . rootID ;
34
+ if ( exists ( parents , parentID ) ) {
35
+ parents [ parentID ] . push ( item ) ;
36
+ } else {
37
+ parents [ parentID ] = [ item ] ;
38
+ }
33
39
} ) ;
34
40
35
41
return parents ;
36
- }
42
+ } ;
37
43
38
44
/**
39
45
* arrayToTree
@@ -52,19 +58,20 @@ function orderByParents(list, config) {
52
58
*/
53
59
54
60
module . exports = function arrayToTree ( options ) {
55
- var config = util . _extend ( {
56
- parentProperty : 'parent_id' ,
57
- data : [ ] ,
58
- customID : 'id'
59
- } , options ) ;
61
+ options = util . _extend ( {
62
+ parentProperty : 'parent_id' ,
63
+ data : [ ] ,
64
+ customID : 'id' ,
65
+ rootID : '0'
66
+ } , options ) ;
60
67
61
- var data = config . data ;
68
+ var data = options . data ;
62
69
63
70
if ( ! util . isArray ( data ) ) {
64
71
throw new Error ( 'Expected an object but got an invalid argument' ) ;
65
72
}
66
73
67
74
var cloned = data . slice ( ) ;
68
- var ordered = orderByParents ( cloned , config ) ;
69
- return createTree ( ordered , ordered [ 0 ] , config . customID ) ;
75
+ var grouped = groupByParents ( cloned , options ) ;
76
+ return createTree ( grouped , grouped [ options . rootID ] , options . customID ) ;
70
77
} ;
0 commit comments