javascript - 优化代码以有效地运行 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}`);
}
}
有没有其他更快的方法,尤其是不需要我弄乱接口的方法
解决方案
的时间复杂度Array.find
应该是O(n)
在您的情况下相当不错并且不会变得更好。正如您已经尝试过的那样,在您的情况下,最好的解决方案是扩展接口。如果您无法更改这些,则可以扩展它们。我们不太了解您的数据模型以及您如何获取员工的这些详细信息,但在 UX 方面,最好的解决方案始终是您通过单个请求获取所需的数据。如果这是不可能的,可以在您使用您的方法之前提前加载和映射此数据。
您提供的代码很好,您可能想要更改所有出现的let
with const
。
推荐阅读
- reactjs - onIonChange 事件后选择的选项取消选择
- python - 更新单个数据帧行中的多列的最有效方法
- javascript - Reactjs 将数据从子函数组件发送回父类组件
- c# - 如何在泛型函数方法调用中使用按参数排序
- java - Java hashmap算法检查值
- java - 如何在 java 中修改 HttpServletRequest 正文?
- vue.js - 是否可以在输入元素 Semantic-UI-Vue 中触发 foucs 事件的弹出窗口
- python - 如何动态设置文件 Python 的路径?
- php - 验证失败不会停止 livewire 组件中的代码执行
- amazon-web-services - 列中的 Aws 描述实例名称和 PublicIP