2016-02-22 39 views
3

我有一个数组,其中包含需要应用于Lazy.js中的项目数组的过滤器函数。我试过使用for循环,但只应用了最后一个过滤器。如何链接lazy.js中的多个过滤器(来自数组)

function (searchText) { 
    var result = Lazy(input); 

    for (var query of this.querylist) { 
     result = result.filter((item) => { 
      return query.filterFunc(item, searchText, query.compareFunc); 
     }); 
    } 

    return result.toArray(); 
} 

有没有办法应用过滤器列表而不硬编码链接?

Here is a fiddle showing the issue

回答

3

可以使用通过将每一个与前一减少遍历滤波器,创造产生的一种。

var result = Lazy(contentArray); 

var allFilters = filters.reduce(function(acc, current) { 
    return acc.filter((item) => current.filterFunc(item)); // return the last one with the current filter applied 
}, result); // start with the original one 


console.log(allFilters.toArray()) 

你可以找到更新的小提琴here

减少只是这更好,更通用的方法:直到调用指定者或的forEach

var allFilters = result 
        .filter(filters[0]) 
        .filter(filters[1]) 
        .filter(filters[2]); 

Lazy.js不会调用过滤器。我把一些日志放在this example

+0

确实reduce()部分解决,或者查询解析延迟,直到调用allFilters.toArray()。与lodash或下划线相比,它是否仍然有显着的性能提升? –

+1

all reduce的作用是创建一个Lazy数组,其中应用了filters数组中的所有过滤器。实际的调用是在调用toArray时完成的。关于绩效增益..我不知道。我从来没有真正测试过这些库的性能。 – toskv