【问题标题】:Optimize code in JavaScript (Currently using too many for loops)优化 JavaScript 中的代码(当前使用太多 for 循环)
【发布时间】:2022-01-10 19:43:33
【问题描述】:

我一直在研究一个数据格式问题,终于得到了答案。

但是,我的答案循环太多,在实现的时候会减慢时间复杂度。

下面是我的代码:

const userInfo = [];

for (let i = 0; i < projects.length; i++) {
  const userProject = projects[i].userProjects;

  for (let j = 0; j < userProject.length; j++) {
    const userExist = userInfo.some((item) =>
      item.userId.includes(userProject[j].user.userId)
    );
    if (!userExist) userInfo.push(userProject[j].user);
  }
}

userInfo.forEach((user) => {
  let tempArr = [];
  for (let i = 0; i < projects.length; i++) {
    const userProject = projects[i].userProjects;
    for (let j = 0; j < userProject.length; j++) {
      if (user.userId === userProject[j].userId)
        tempArr.push({
          projectId: projects[i].projectId,
          name: projects[i].name,
        });
    }
  }
  user.project = tempArr;
});

console.log(userInfo);

有什么方法可以优化我的代码吗?我试图将嵌套的 for 循环组合在一起,但没有工作......

请帮忙。非常感谢!!!

【问题讨论】:

  • 您需要的是一个更好的数据结构,该结构根据您的应用程序需要执行的操作进行组织。
  • 分享您的数据并请告诉我们预期的输出是什么

标签: javascript for-loop data-structures


【解决方案1】:

在顶部,外部两个循环看起来是必要的(因为您有 N 个项目 * M 个 userProjects),但第三个 .some 不是 - 将 userInfo 从数组更改为 userIds 到他们的映射用户,因此在第二个循环中,您只需查看 userId 是否已存在(O(1)),如果不存在则分配。

不要分配用户,而是在最后分配一个您需要的形状的对象 - [{ projectId, name }]。这将使您不必再次遍历整个数组 - 一旦您检查是否需要为 userId 创建周围数组,无论您是否必须将对象推送到数组是否在该迭代中创建数组。

const userProjectsByUserId = new Map();
for (const { userProjects, projectId, name } of projects) {
    for (const { user } of projects) {
        if (!userProjectsByUserId.has(user.userId)) {
            userProjectsByUserId.set(user.userId, { user, projects: [] }]);
        }
        userProjectsByUserId.get(user.userId).projects.push({ projectId, name });
    }
}

这会给你一个形状的地图

userId => {
  user,
  projects: [
    { projectId, name },
    ...

如果您需要当前代码提供给您的确切数据结构,那么之后,请执行以下操作:

const output = [...userProjectsByUserId.values()]
  .map(({ user, projects }) => ({ ...user, project: projects }));

(尽管您可能会考虑使用projects 而不是project,因为它是项目的集合,而不是单个项目)

【讨论】:

  • 非常感谢。如果不使用数据结构 new Map(),而是使用 Array 会怎样?
  • 如果您使用数组,您将无法立即在其中查找 userId - 相反,您必须在数组中搜索匹配项 (O(n)) 而不是只需将其作为地图或对象的属性查找 (O(1))。所以,分组时不要使用数组;这会让事情变得太低效。
  • 知道了,非常感谢您的帮助!!
猜你喜欢
  • 2019-01-11
  • 1970-01-01
  • 2011-10-12
  • 2021-10-11
  • 1970-01-01
  • 2014-03-05
  • 2012-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多