網站搜尋

javascript - 如何使用 lodash 改進這個例程?


我寫了一些我不自豪的程式碼,作為一個 lodash 新手,我希望能收到一些如何改進這段程式碼的反饋。

要求是為某些類型的折扣用預設值填充時間段陣列,例如:

例如,每個時段(從左邊往下)對應每個折扣(最上排)都有 6 張桌子。在中午 12:00 時,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;
            }
          }
        });
    });
}