UNPKG

2.17 kBJavaScriptView Raw
1var setupDefaults = require('./setupDefaults')
2
3var map = require('./map')
4var orderBy = require('./orderBy')
5
6var clone = require('./clone')
7var includes = require('./includes')
8var each = require('./each')
9var remove = require('./remove')
10
11var assign = require('./assign')
12
13function strictTree (array, optChildren) {
14 each(array, function (item) {
15 if (item.children && !item.children.length) {
16 remove(item, optChildren)
17 }
18 })
19}
20
21/**
22 * 将一个带层级的数据列表转成树结构
23 *
24 * @param {Array} array 数组
25 * @param {Object} options {strict: false, parentKey: 'parentId', key: 'id', children: 'children', mapChildren: 'children', data: 'data'}
26 * @return {Array}
27 */
28function toArrayTree (array, options) {
29 var opts = assign({}, setupDefaults.treeOptions, options)
30 var optStrict = opts.strict
31 var optKey = opts.key
32 var optParentKey = opts.parentKey
33 var optChildren = opts.children
34 var optMapChildren = opts.mapChildren
35 var optSortKey = opts.sortKey
36 var optReverse = opts.reverse
37 var optData = opts.data
38 var result = []
39 var treeMap = {}
40 var idList, id, treeData, parentId
41
42 if (optSortKey) {
43 array = orderBy(clone(array), optSortKey)
44 if (optReverse) {
45 array = array.reverse()
46 }
47 }
48
49 idList = map(array, function (item) {
50 return item[optKey]
51 })
52
53 each(array, function (item) {
54 id = item[optKey]
55
56 if (optData) {
57 treeData = {}
58 treeData[optData] = item
59 } else {
60 treeData = item
61 }
62
63 parentId = item[optParentKey]
64 treeMap[id] = treeMap[id] || []
65 treeMap[parentId] = treeMap[parentId] || []
66 treeMap[parentId].push(treeData)
67 treeData[optKey] = id
68 treeData[optParentKey] = parentId
69 treeData[optChildren] = treeMap[id]
70 if (optMapChildren) {
71 treeData[optMapChildren] = treeMap[id]
72 }
73
74 if (!optStrict || (optStrict && !parentId)) {
75 if (!includes(idList, parentId)) {
76 result.push(treeData)
77 }
78 }
79 })
80
81 if (optStrict) {
82 strictTree(array, optChildren)
83 }
84
85 return result
86}
87
88module.exports = toArrayTree