如何用 lodash 改进这个程序?

Posted

技术标签:

【中文标题】如何用 lodash 改进这个程序?【英文标题】:How to improve this routine with lodash? 【发布时间】:2017-06-22 00:32:37 【问题描述】:

我编写了一些我并不引以为豪的代码,作为一个 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 时隙,另一个遍历所有折扣的 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;
            
          
        );
    );

【讨论】:

嗯,是的,这似乎将平均时间减半,谢谢。我仍在寻找有关 lodash ORIGINAL resetDefaults: 20.270ms resetDefaults: 12.751ms resetDefaults: 5.770ms resetDefaults: 3.367ms resetDefaults: 2.509ms resetDefaults: 4.228ms WITH OBJECT CHANGE resetDefaults: 14.946ms resetDefaults: 6.803ms 方面的一些反馈重置默认值:2.814 毫秒重置默认值:1.314 毫秒重置默认值:1.367 毫秒重置默认值:2.641 毫秒 你的代码很好,这是一个 O(N) 操作。关键是适当的对象缓存,因此您只需在事情发生变化时运行计算 虽然我仍然对您使用术语表感到​​困惑

以上是关于如何用 lodash 改进这个程序?的主要内容,如果未能解决你的问题,请参考以下文章

matlab如何用循环体导入多张图片并在一个窗口显示(程序改进)!!!急急急!!!

如何用函数链中的空字符串替换数据库中的空值

如何用IDA找到这个程序中特定函数地址

如何用 C++ 编写程序,使其在执行后会自行删除?

如何写一个C或Java应用程序来处理TCP SYN请求[关闭]

如何用Inno Setup做更新程序