Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在只遍历javascript数组一次的情况下,对其应用数量可变的筛选条件?_Javascript_Algorithm_Performance_Filter - Fatal编程技术网

在只遍历javascript数组一次的情况下,对其应用数量可变的筛选条件?

在只遍历javascript数组一次的情况下,对其应用数量可变的筛选条件?,javascript,algorithm,performance,filter,Javascript,Algorithm,Performance,Filter,我有一个包含嵌套数据的javascript数组,其中包含将显示给用户的数据 用户希望能够对正在查看的数据应用0到n的筛选条件 为了实现这一目标,我需要首先找到与0到n过滤条件匹配的元素,然后对这些条目执行一些数据操作。解决这一问题的一个明显方法是让几个filter语句背对背(其中包含一个条件检查,以查看是否需要应用过滤器),然后在末尾添加一个map函数,如下所示: var firstFilterList = _.filter(myData, firstFilterFunction); var s

我有一个包含嵌套数据的javascript数组,其中包含将显示给用户的数据

用户希望能够对正在查看的数据应用0到n的筛选条件

为了实现这一目标,我需要首先找到与0到n过滤条件匹配的元素,然后对这些条目执行一些数据操作。解决这一问题的一个明显方法是让几个filter语句背对背(其中包含一个条件检查,以查看是否需要应用过滤器),然后在末尾添加一个map函数,如下所示:

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对象添加字段等)是否被视为不好的做法。

您可以做的一件事是将所有过滤函数组合成一个函数,使用
reduce
,然后使用组合函数调用
filter

var combined = [firstFilterFunction, seconfFilterFunction, ...]
                .reduce((x, y) => (z => x(z) && y(z)));
var filtered = myData.filter(combined);

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

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);

小更正:您正在过滤一个数组,而不是JSON数组。JSON数组是数组的文本表示形式。您想实现什么?当你在寻找最佳实践时,首先要告诉你想要实现什么,然后告诉你的方法是什么。通过这种方式,读者可以更好地理解需求并帮助您。我相信,通过保留过滤器功能,并使用单独的过滤器定义组合过滤器功能,您可以两全其美。这只是我的观点。@Rajesh我试图实现的是用0到n个过滤器过滤一个数组,并在过滤后的数组中处理数据,同时遍历数组的次数最少。我的方法目前在问题的最后一段中得到了强调。我想知道为什么遍历最少次数很重要。您的阵列是否如此之大,以至于性能损失是显而易见的?如果有证据表明这是过程中缓慢的一部分,并且影响了可用性,那么当然要努力优化它。否则,最佳实践是以这样一种方式编写代码,即其他阅读您的代码的人可以轻松理解其意图。在大多数情况下,可读性比加速更有价值。