treeUtil.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import deepClone from './deepClone'
  2. var util = {};
  3. /**
  4. * 将树形结构转成数组结构
  5. * @param {Array} treeData 数据源
  6. * @param {Object} treeProps 树结构配置 { id : "menu_id", children : "children" }
  7. * vk.pubfn.treeToArray(treeData);
  8. */
  9. util.treeToArray = function(treeData, treeProps) {
  10. let newTreeData = deepClone(treeData);
  11. return util.treeToArrayFn(newTreeData, treeProps);
  12. };
  13. util.treeToArrayFn = function(treeData, treeProps = {}, arr=[], current_parent_id) {
  14. let { id="_id", parent_id="parent_id", children = "children", deleteChildren = true } = treeProps;
  15. for(let i in treeData){
  16. let item = treeData[i];
  17. if(current_parent_id) item[parent_id] = current_parent_id;
  18. arr.push(item);
  19. if(item[children] && item[children].length>0){
  20. arr = util.treeToArrayFn(item[children], treeProps, arr, item[id]);
  21. }
  22. if(deleteChildren){
  23. delete item[children];
  24. }
  25. }
  26. return arr;
  27. };
  28. /**
  29. * 数组结构转树形结构
  30. let tree = vk.pubfn.arrayToTree(arrayData,{
  31. id:"code",
  32. parent_id:"parent_code",
  33. });
  34. */
  35. util.arrayToTree = function(originalArrayData,treeProps) {
  36. let arrayData = deepClone(originalArrayData);
  37. let {
  38. id="_id",
  39. parent_id="parent_id",
  40. children = "children",
  41. deleteParentId = false,
  42. need_field
  43. } = treeProps;
  44. let result = [];
  45. let temp = {};
  46. for (let i = 0; i < arrayData.length; i++) {
  47. temp[arrayData[i][id]] = arrayData[i]; // 以id作为索引存储元素,可以无需遍历直接定位元素
  48. }
  49. for (let j = 0; j < arrayData.length; j++) {
  50. let currentElement = arrayData[j];
  51. let newCurrentElement = {};
  52. if(need_field){
  53. need_field = uniqueArr(need_field.concat([id,parent_id,children]));
  54. for(let keyName in currentElement){
  55. if(need_field.indexOf(keyName) === -1){
  56. delete currentElement[keyName];
  57. }
  58. }
  59. }
  60. let tempCurrentElementParent = temp[currentElement[parent_id]]; // 临时变量里面的当前元素的父元素
  61. if (tempCurrentElementParent) {
  62. // 如果存在父元素
  63. if (!tempCurrentElementParent[children]) {
  64. // 如果父元素没有chindren键
  65. tempCurrentElementParent[children] = []; // 设上父元素的children键
  66. }
  67. if(deleteParentId){
  68. delete currentElement[parent_id];
  69. }
  70. tempCurrentElementParent[children].push(currentElement); // 给父元素加上当前元素作为子元素
  71. } else {
  72. // 不存在父元素,意味着当前元素是一级元素
  73. result.push(currentElement);
  74. }
  75. }
  76. return result;
  77. };
  78. // 最简单数组去重法
  79. function uniqueArr(array) {
  80. let n = []; //一个新的临时数组
  81. //遍历当前数组
  82. for (let i = 0; i < array.length; i++) {
  83. //如果当前数组的第i已经保存进了临时数组,那么跳过,
  84. //否则把当前项push到临时数组里面
  85. if (n.indexOf(array[i]) == -1) n.push(array[i]);
  86. }
  87. return n;
  88. }
  89. export default util;