toArrayTree.js 2.3 KB

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