有没有一种方法可以更优化地编写此代码-所以我只遍历数组一次

时间:2019-07-10 16:21:20

标签: javascript ramda.js

我有以下逻辑和this.preAppliedList,它是IResFilter的数组。

IResFilter对象的形状并不重要,但是为了完整起见,我将其粘贴到其中。

所以我的问题是

鉴于includesFilter函数中RifElse函数的输出,我将删除或添加过滤器。

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

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

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

P.S。我知道我可以通过使用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);
}

1 个答案:

答案 0 :(得分:1)

关于此的我的标准建议是不要专注于性能,尤其是当您不希望数字甚至接近200个数组元素时,除非您已对应用程序进行了概要分析并发现此代码是一个热点。

Ramda是专为成分编码而设计的。因此,尽管您可以使用Ramda的传感器在这里做一些事情,但除非有充分的理由,否则我永远也不会增加这种复杂性。


两个小问题:

  • 使用R前缀重命名Ramda函数有什么好处?

  • 为什么在每次调用主函数时都在内部调用curry而不是在外部调用一次?也就是说,为什么不这样做:

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