2017-02-04 9 views
2

Я написал код, которым я не горжусь, и как lodash noob Я был бы признателен за некоторые отзывы о том, как улучшить этот код.Как улучшить эту рутину с помощью lodash?

Требования, чтобы заполнить массив временных интервалов со значениями по умолчанию для определенных типов скидок, например: enter image description here

К примеру, есть 6 столов для каждой скидки (верхний ряд) для каждого из временных интервалов, идущих вниз по левому , В 12:00 вечера есть 2 таблицы в столбце скидки 20% и т. Д. С правой стороны - итоговые значения для каждого временного интервала.

я в настоящее время данных в этом формате:

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>; 
} 

И тогда я делаю петлю Еогеаспа вниз по временным интервалам, а затем Еогеасп временной интервал, еще один цикл Еогеаспа через через все скидки. Затем, если скидка соответствует 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; 
       } 
      } 
     }); 
    }); 
} 

ответ

0

вы можете сразу же ускорить Lookups, используя объект вместо массива (заявления типа могут быть ошибочными, но вы получите идею)

Я укоротить одну из имен переменных только, чтобы сделать его легче читать

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; 
      } 
      } 
     }); 
    }); 
} 
+0

Хм, да, это, как правило, сокращало вдвое время в среднем, спасибо. Я все еще ищу какой-то обратной связи на моем подходе с точки зрения lodash ОРИГИНАЛЬНЫХ resetDefaults: 20.270ms resetDefaults: 12.751ms resetDefaults: 5.770ms resetDefaults: 3.367ms resetDefaults: 2.509ms resetDefaults: 4.228ms с объектными ПЕРЕМЕН resetDefaults: 14.946ms resetDefaults: 6.803ms resetDefaults: 2.814ms resetDefaults: 1.314ms resetDefaults: 1.367ms resetDefaults: 2.641ms – Rodney

+0

вы код прекрасно, это операция O (N). ключ - это правильное кэширование объектов, поэтому вам нужно только выполнять вычисления, когда вещи меняются – TheRealMrCrowley

+0

, хотя я все еще запутался в использовании таблиц терминов – TheRealMrCrowley