2017-02-04 49 views
2

我写了一些我并不感到自豪的代码,并且作为lodash noob,我将不胜感激关于如何改进此代码的一些反馈。如何用lodash改善这个程序?

要求是填充时隙的阵列与默认值对于某些类型的折扣,例如:enter image description here

例如,存在用于每一个折扣(顶行)的每个时隙上左边下降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时隙,通过跨所有折扣另一个foreach循环。然后,如果折扣与X匹配,我检查该时间和折扣是否在另一个数组(折扣20次)中,如果是,则执行一些操作。

该代码有效,但我相信它效率低下 - 我只是不知道用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

您可以立即使用的对象,而不是一个数组的加快查找(类型声明可能是错误的,但你的想法)

我缩短变量名的一个只是为了让更容易阅读

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 ORIGINAL resetDefaults方面对我的做法有些意见:20.270ms resetDefaults:12.751ms resetDefaults:5.770ms resetDefaults:3.367ms resetDefaults:2.509ms resetDefaults:4.228ms WITH对象改变 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