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

标签 javascript ramda.js

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

IResFilter 对象的形状并不重要,但为了完整起见,我将把它粘贴进去。

所以我的问题是;

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

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

数组的最大长度可能是 200,但用户不太可能应用如此多的一种类型的过滤器。

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

附注我知道我可以通过使用 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);
}

最佳答案

我对此的标准建议是不要关注性能,特别是当您不希望数字达到接近 200 个数组元素时,除非您已经分析了应用程序并发现此代码是热点。

Ramda 非常适合组合编码。因此,虽然您可能可以使用 Ramda 的传感器在这里做一些事情,但除非有充分的理由,否则我永远不会增加这种复杂性。

<小时/>

两个小问题:

  • 您认为使用 R 前缀重命名 Ramda 函数有何优势?

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

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

关于javascript - 有没有办法更优化地编写此代码 - 所以我只遍历数组一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56974897/

相关文章:

javascript - 检查cookie数组元素是否存在

javascript - 如何处理 Ramda 中的错误

javascript - 为什么我可以将函数传递给提升的 R.divide?

functional-programming - 映射时如何合并两个数组?

javascript - 使用 Ramda 将两个数组与两个不同的键组合在一起

javascript - Google map 信息窗口表单内容显示在 map 下方

javascript - jquery中如何获取div的值?

javascript - 根据另一个 bool 数组过滤数组

javascript - 禁用 javascript 时使 displaytag 工作

javascript - Jquery Autocomplete()/Catcomplete() 函数不起作用