目前在开发一个不一样的低代码软件开发平台,设计目标是可以满足复杂业务应用的深度可定制平台。因此,必须确保平台的设计具有高度的灵活度、可定制性,以面对有可能的错综复杂的业务需求。所以,不论是可视化界面设计还是数据结构设计都是按可扩展、可无限层级嵌套的方式设计。
于是,出现了一个问题:数据的设计上是具有足够的灵活度了,但是不可能让用户直接编辑这种复杂的数据,以我一惯人性化设计的风格绝对不允许让用户懵比。所以准备开发一个通用的可视化数据编辑器,以树型结构的方式在一个所见即所得的数据设计器中自由对多级层次型数据做自由的增删改查。
通用数据编辑器雏形
实例:例如一个菜单组件的数据就是一个典型的树型结构数据,允许用户做静态数据配置也可以在运行时加载服务器数据做动态替换。系统提供数据编辑器让用户可以方便维护菜单项的静态数据。
需求:从给定的数据创建层级结构一致的数据副本用于生成TreeView,源数据具有哪些属性不确定,只具有共同的items属性,也没有能表示层次上下级关系的属性,treeview数据项确定(id,label,icon,children),副本中需要将源数据中的某些属性映射到treeview的数据。
要求:1.数据处理中不产生数据污染,不允许对源数据做任何写操作,2.通用函数,可以处理任何不确定的源数据,3.以本人追求程序极致性能的作风肯定不允许使用递归。
分析:
很多同学张口就来:不就是树的遍历嘛。
常规的树结构遍历算法一般有以下几种:
1.用递归遍历,上文中已不许使用
2.用栈遍历,其中有广度优先和深度优先两大类算法
3.用队列遍历,按从上往下的层次顺序遍历
以上遍历都解决不了一个关键问题:虽然可以把每个数据项都访问到,但是数据中并没有任何能表示其父级关系的属性,因此无法向上回溯确定其父级(上一次访问到的数据不一定是当前数据的父级),就无法在父级集合中增加这个数据项。
也有的同学说可以深度拷贝呀,深度拷贝底层一般也是用的递归,而且出来的是跟源数据是一模一样的数据,还需要额外再做一波处理。
昨天想了好大一会没有好的方法,就去上了个厕所,结果一抖一激灵,瞬间就有了:
1,函数参数:源数据集合、每个新数据创建的回调函数
2,实现过程:
第一步,需要两个数组,分别对应于源数据和目标新数据的每一层的数据项,因此两个数组的实际长度必然一样大。
第二步,循环源数据的第一层,将每个数据项先装入数组SL,同时逐个回调创建新数据的函数,将新数据装入另一个数组DL
第三部,设置一个标记变量初始值为true,后面会说明这个标记的意义
第四步,一个while循环体,退出条件是标记为false
第五步,循环体里再创建两个临时数组SLT和DLT,用于装载当前某层下的所有下一级节点
第六步,循环SL,取出当前每个元素SE,同时跟根据SE的下标位置可以取出对应位置的元素DE,DE就是此轮新元素的父节点;将SE的每个下级元素装入SLT,同时以每个下级元素为参数回调创建新数据,将新数据加入DE的子数据集合,同时加入DLT
第七部,将SL替换为SLT,DL替换为DLT,进入下一次while循环,便实现层层推进
循环体里先将标记置为fals,只要当前层级下存在一个以上的子元素就置为true
走出while后便得到了需要的结果。
这个算法的关键在于逐层推进,每一层的元素是同级别下的所有元素,一次处理一层的整批数据。
启示:编程时一定要多喝水,你懂的[呲牙]
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved