javascript - 仅遍历一次时将可变数量的过滤条件应用于 javascript 数组?

标签 javascript algorithm performance filter

我有一个嵌套数据的 javascript 数组,用于保存将显示给用户的数据。

用户希望能够将 0 到 n 个过滤条件应用于他们正在查看的数据。

为了实现这个目标,我需要首先找到符合 0 到 n 过滤条件的元素,然后对这些条目执行一些数据操作。解决这个问题的一个明显方法是有几个背靠背的过滤器语句(在它们内部进行条件检查以查看是否需要应用过滤器),然后在末尾有一个映射函数,如下所示:

var firstFilterList = _.filter(myData, firstFilterFunction);
var secondFilterList = _.filter(firstFilterList, secondFilterFunction);
var thirdFilterList = _.filter(secondFilterList, thirdFilterFunction);
var finalList = _.map(thirdFilterList, postFilterFunction);

然而,在这种情况下,javascript 数组将被遍历 4 次。解决这个问题的一种方法是让一个过滤器在确定是否存在匹配之前检查所有 3(或 0 到 n)条件,然后在函数末尾的过滤器内部进行数据操作,然而,这似乎有点老套,并且使“过滤器”负责不止一件事,这并不理想。好处是 javascript 数组只被遍历一次。

是否有一种“最佳实践”方式来完成我想要完成的事情?

编辑:我也很想知道在过滤器函数中执行数据操作(向 javascript 对象等添加字段等)是否被认为是不好的做法。

最佳答案

您可以将所有过滤器函数收集到一个数组中,并使用实际数据集检查每个过滤器,然后根据结果进行过滤。然后使用您的映射函数来获得想要的结果。

var data = [ /* ... */ ],
    filterFn1 = () => Math.round(Math.random()),
    filterFn2 = (age) => age > 35,
    filterFn3 = year => year === 1955,
    fns = [filterFn1, filterFn2, filterFn2],
    whatever = ... // final function for mapping
    result = data
        .filter(x => fns.every(f => f(x)))
        .map(whatever);

关于javascript - 仅遍历一次时将可变数量的过滤条件应用于 javascript 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58506297/

相关文章:

java - Java中最快的循环同步是什么(ExecutorService vs. CyclicBarrier vs. X)?

javascript - 如何为应用程序创建外部链接 (PhoneGap)

javascript - d3js v4 : How can I apply force to nodes onclick and make it look like a tween?

algorithm - 在有向未加权图中查找两个节点之间的所有最短路径的数量

java - 根据单词之间的空格查找文本的宽度(JAVA)

c - 仅使用 C 的分布式系统设计

Hadoop 中具有大量多个输出文件的性能

javascript - 是否有 Jasmine 匹配器来比较对象的属性子集

javascript - 使用 jQuery 选择 Div 的最后一个元素不起作用

c# - Linq to SQL 一对多关系