我有以下逻辑和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);
}
答案 0 :(得分:1)
关于此的我的标准建议是不要专注于性能,尤其是当您不希望数字甚至接近200个数组元素时,除非您已对应用程序进行了概要分析并发现此代码是一个热点。
Ramda是专为成分编码而设计的。因此,尽管您可以使用Ramda的传感器在这里做一些事情,但除非有充分的理由,否则我永远也不会增加这种复杂性。
两个小问题:
使用R
前缀重命名Ramda函数有什么好处?
为什么在每次调用主函数时都在内部调用curry
而不是在外部调用一次?也就是说,为什么不这样做:
areFiltersSame = curry ( (f1, f2) => ... )