代码之家  ›  专栏  ›  技术社区  ›  codeepic zetriks

有没有更好的方法来编写这段代码-所以我只遍历数组一次

  •  0
  • codeepic zetriks  · 技术社区  · 6 年前

    this.preAppliedList 这是一系列 IResFilter .

    不是那个形状的 IResFilter过滤器

    所以我的问题是;

    给定的输出 includesFilter RifElse 函数I将移除或添加筛选器。

    这意味着,首先遍历数组以确定项是否已在数组中,然后遍历同一数组以添加或删除项。

    数组的最大长度可以是200,但用户不太可能应用这么多同一类型的过滤器。

    出于可伸缩性的考虑,我如何在Ramda中编写相同的逻辑,通过只遍历一次数组来提高性能。

    P、 我知道我可以使用for循环来确保单数组遍历和短路,但我想知道Ramda的方法。

    export interface IResFilter {
        DisplayKeyItem: string;
        DisplayKeyValue: string;
        KeyItem: string;
        Countor: string;
        FilterName: string;
        selected?: boolean;
    }
    
    
    export const areFiltersSame = (f1: IResFilter, f2: IResFilter) =>
      ReqBy(Rpick(['DisplayKeyValue', 'KeyItem']), f1, f2);
    
    
    updatePreAppliedList(filter: IResFilter): void {
      const areFiltersSameCurried = Rcurry(areFiltersSame)(filter);
      const includesFilter = Rany(areFiltersSameCurried);
      const removeFilter = Rreject(areFiltersSameCurried);
    
      this.preAppliedList = RifElse(
        includesFilter,
        removeFilter,
        Rappend(filter)
      )(this.preAppliedList);
    }
    
    0 回复  |  直到 6 年前
        1
  •  1
  •   Scott Sauyet    6 年前

    我的标准建议是不要把重点放在性能上,特别是当您不希望数字接近200个数组元素时,除非您已经分析了应用程序并发现这段代码是一个热点。

    Ramda非常适合组合编码。所以,虽然你可以用Ramda的传感器做一些事情,但除非有一个很好的理由,否则我永远也不会费心增加复杂性。


    两个小问题:

    • 使用 R

    • 你为什么打电话 curry 在主函数的每次调用中,而不是在外部调用一次?也就是说,为什么不:

      areFiltersSame = curry ( (f1, f2) => ... )