javascript - 如何使用 lodash 改进此例程?
我写了一些我不自豪的代码,作为一个 lodash 新手,我希望能得到一些关于如何改进这段代码的反馈。
要求是为某些类型的折扣用默认值填充时间段数组,例如:
例如,每个时间段(从左侧向下)每个折扣(顶行)都有6张桌子。在中午12点,20%折扣列中有2张桌子,等等。在右侧是每个时间段的总数。
我目前有这样的数据格式:
class DiscountTimeTable {
public restaurantScheduleDiscountId: number;
public scheduleDiscountId: number;
public name: string;
public tables: number;
}
class TablesForTimesAndDiscount {
public restaurantScheduleDayTimeId: number;
public timeSlot: string;
public discounts: Array<DiscountTimeTable>;
}
然后我对时间段做一个 foreach 循环,然后对每个时间段,再做一个 foreach 循环遍历所有折扣。然后,如果折扣匹配 X,我检查该时间和折扣是否在另一个数组(discount20Times)中,如果在,则执行某些操作。
代码可以运行,但我确定它效率不高——我只是不知道应该用 Lodash 采取什么方法来改进它?
public resetDefaults(): void {
let discount10Times: string[] = ['PT13H30M', 'PT16H30M', 'PT19H30M', 'PT22H30M'];
let discount20Times: string[] = ['PT12H', 'PT12H30M', 'PT13H', 'PT17H', 'PT17H30M', 'PT18H', 'PT18H30M', 'PT19H', 'PT23H'];
_.forEach(this.tablesForTimesAndDiscounts, (tablesForTimesAndDiscount: TablesForTimesAndDiscount) => {
_.forEach(tablesForTimesAndDiscount.discounts, (discount: DiscountTimeTable) => {
if (discount.scheduleDiscountId === 0) {
discount.tables = 6; //regardless of time - all tables
}
if (discount.scheduleDiscountId === 10) {
if (_.find(discount10Times, (time: string) => time == tablesForTimesAndDiscount.timeSlot)) {
discount.tables = 2;
}
}
if (discount.scheduleDiscountId === 20) {
if (_.find(discount20Times, (time: string) => time == tablesForTimesAndDiscount.timeSlot)) {
discount.tables = 2;
}
}
});
});
}
答案#1
你可以立即通过使用对象而不是数组来加快查找速度(类型声明可能不正确,但你明白意思)
我缩短了其中一个变量名,只是为了让它更容易阅读
public resetDefaults(): void {
let discount10Times: Object<string> = {
PT13H30M: 'PT13H30M',
PT16H30M: 'PT16H30M',
PT19H30M: 'PT22H30M'
};
let discount20Times: Object<string> = {
PT12H: 'PT12H',
PT12H30M: 'PT12H30M',
PT13H: 'PT13H',
PT17H: 'PT17H',
PT17H30M: 'PT17H30M',
PT18H: 'PT18H',
PT18H30M: 'PT18H30M',
PT19H: 'PT19H',
PT23H: 'PT23H'
};
_.forEach(this.tablesForTimesAndDiscounts, (timesAndDiscount: TablesForTimesAndDiscount) => {
_.forEach(timesAndDiscount.discounts, (discount: DiscountTimeTable) => {
if (discount.scheduleDiscountId === 0) {
discount.tables = 6; //regardless of time - all tables
}
if (discount.scheduleDiscountId === 10) {
if (discount10Times[timesAndDiscount.timeSlot]) {
discount.tables = 2;
}
}
if (discount.scheduleDiscountId === 20) {
if (discount20Times[timesAndDiscount.timeSlot]) {
discount.tables = 2;
}
}
});
});
}
