先 concat 再去重引发的性能问题

发布于 2024-12-11 23:01:39 字数 1527 浏览 6 评论 0

在金山云的组织架构页面,需要生成一棵树,其中一个逻辑是将子部门的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

仙气飘飘

暂无简介

文章
评论
27 人气
更多

推荐作者

卷耳

文章 0 评论 0

佚名

文章 0 评论 0

℉服软

文章 0 评论 0

qq_2gSKZM

文章 0 评论 0

凉宸

文章 0 评论 0

gyhjy

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文