我有以下逻辑和 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/