首页 > 解决方案 > 优化代码以有效地运行 2 组或更多组数据

问题描述

嗨,我遇到了这个问题,该程序运行时间太长,我的任务是让它运行得更快

interface Payroll {
  empNo: string;
  vacationDays: number;
}

interface AddressBook {
  empNo: string;
  email: string;
}

interface WorkHistory {
  empNo: string;
  name: string;
  yearsEmployed: number;
}

interface EmailApi {
  sendEmail(email: string, body: string);
}

// We haved decided to grant bonus vacation to every employee, 1 day per year of experience
// we need to email them a notice
EmailVacationGrant(
  emailApi: EmailApi,
  workHistory: WorkHistory[],
  addressBook: AddressBook[],
  payroll: Payroll[],
) {
  for(int i=0; i<workHistory.length; ++i) {
    let employee = wh[i];
    let address = addressBook.find(x => x.empNo==employee.empNo);
    let payroll = payroll.find(x => x.empNo==employee.empNo);

    let newVacationBalance = employee.yearsEmployed + payroll.vacationDays;
    emailApi.sendEmail(
      address.email,
      `Dear ${employee.name}\n` +
      `based on your ${employee.yearsEmployed} years of employment, you have been granted ${employee.yearsEmployed} days of vacation, bringing your total to ${newVacationBalance}`);
  }
}

在做了一些研究之后,我了解到大多数浏览器不喜欢这种.find方法,并且更喜欢通用for循环。知道这一点后,我认为将所有内容都放在一个界面中是合适的。我的解决方案如下

interface WorkHistory {
  empNo: string;
  vacationDays: number;
  email: string;
  name: string;
  yearsEmployed: number;
}

interface EmailApi {
  sendEmail(email: string, body: string);
}

// We haved decided to grant bonus vacation to every employee, 1 day per year of experience
// we need to email them a notice
EmailVacationGrant(
  emailApi: EmailApi,
  workHistory: WorkHistory[],
) {
  for(int i=0; i<workHistory.length; ++i) { // in js a for loop is much faster the .find however I wanted to stick with to make sure the time complexity wasnt too huge
    let employee = wh[i];
    let address = employee.email;
    let payroll = employee.payroll;

    let newVacationBalance = employee.yearsEmployed + employee.vacationDays;
    emailApi.sendEmail(
      employee.email,
      `Dear ${employee.name}\n` +
      `based on your ${employee.yearsEmployed} years of employment, you have been granted ${employee.yearsEmployed} days of vacation, bringing your total to ${newVacationBalance}`);
  }
}

有没有其他更快的方法,尤其是不需要我弄乱接口的方法

标签: javascripttypescriptoptimizationinterface

解决方案


的时间复杂度Array.find应该是O(n)在您的情况下相当不错并且不会变得更好。正如您已经尝试过的那样,在您的情况下,最好的解决方案是扩展接口。如果您无法更改这些,则可以扩展它们。我们不太了解您的数据模型以及您如何获取员工的这些详细信息,但在 UX 方面,最好的解决方案始终是您通过单个请求获取所需的数据。如果这是不可能的,可以在您使用您的方法之前提前加载和映射此数据。

您提供的代码很好,您可能想要更改所有出现的letwith const


推荐阅读