/**
* 这是全国所有的行政区域,大概4000个,value是该区域有多少用户,默认是0,后面会根据limit数组算
*/
let full= [
{id: 1, pid: 0, label: '北京市', value: 0}, {id: 2, pid: 0, label: '福建省', value: 0}, {id: 3,pid: 0,label: '香港特别行政区',value: 0},
{id: 4, pid: 1, label: '东城区', value: 0},
{id: 5, pid: 2, label: '福州市', value: 0}, {id: 6, pid: 2, label: '厦门市', value: 0},
];
/**
* 这是组装出来的全国行政区域的树
*/
let fullTree = [
{id: 1, pid: 0, label: '北京市', value: 0, children: [{id: 4, pid: 1, label: '东城区', value: 0, children: []}]},
{id: 2, pid: 0, label: '福建省', value: 0, children: [{id: 5, pid: 2, label: '福州市', value: 0, children: []}, {id: 6, pid: 2, label: '厦门市', value: 0, children: []}]},
{id: 3, pid: 0, label: '香港特别行政区', value: 0,children:[]}
];
这是原始没有经过计算的树
/**
* 这是所有用户的行政区域的并集,比如系统里就A和B两个用户,A是福建省,B是福建省厦门市,那么这里就是福建省和福建省厦门市
*/
let limit=[
{id:6,pid:2,label:'厦门市',value:5}
];
/**
* 这是根据limit和full数组算出来的树
*/
let limitTree=[
{id:2,pid:0,label:'福建省',value:5,children:[{id:6,pid:2,label:'厦门市',value:5,children:[]}]}
];
这是计算后得到的树,想要达到这种效果
目前我是这么做的,遍历limit数组,从full数组里面一级一级往上找它的父节点并更新value,然后再把找到的这些节点组装成一棵树。
但是,如果limit数组一多,比如limit就是full数组,那么构造时间会好几秒,那就凉了。
我以前想过说就是full数组的value也查出来,组装好后再去自底向上裁剪掉value为0的节点,但是感觉还不如我现在的...
所以,有没有啥好的思路?
1.查询效率优化
把
full
数组重新排一下查找父节点时直接通过
full2[e.pid]
获取。2. 减少父节点赋值次数
树组装完成之前先不更新父节点的
value
,组装完成后通过一个递归去一次性更新完整代码
实测3500+数据可以在20毫秒内完成(cpu为i3-4170,内存8G DDR3 1600MHz)