先 concat 再去重引发的性能问题
在金山云的组织架构页面,需要生成一棵树,其中一个逻辑是将子部门的 uuid 附加到父级上,一层层嵌套,最终根节点包含整棵树的部门 uuid。可能大部分客户的组织架构都不是很复杂,嵌套比较少,比如浪潮,如果人员和部门数量都非常多,但是都是平铺的。金山云的部门结构就比较复杂,包含大量嵌套,这个性能问题就出来了。
问题表现
生成了 33 万 条数据,其中大量冗余数据,后面去重后只有 551 条。由此导致用户进入页面之后,树 loading 完成了很久,但是却被主进程阻塞,导致性能很差。
问题代码
省略一些不影响的代码。主要逻辑是一层层遍历树,然后将自己部门 uuid 合并到祖先节点。
const transformedDepartmentMapping = {};
processOnAncestor(
transformedDepartmentMapping,
transformedDepartment,
(parent, current) => {
const currentDepartments = current.departments || [current.department.uuid];
parent.departments = (parent.departments || []).concat(currentDepartments);
descendantMap[parent.id] = uniq(parent.departments);
}
);
问题就出现在 6、7、8 行。先 concat,在进行 uniq。还有一个地方忘记去重了,生成了 33w 条数据。
解决办法
先判断是否存在再考虑 push,而不是先 push 再去重
const getUniqParentDepartments = (parent, current, mapping)=>{
const currentDepartments = current.departments || [current.department.uuid];
const parentDepartments = parent.departments || [];
currentDepartments.forEach(v => {
if (!mapping[v]) {
parentDepartments.push(v);
}
});
return parentDepartments
}
parent.departments = getUniqParentDepartments(parent, current, transformedDepartmentMapping);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论