如何在循环中(从数组中)链接lazy.js中的多个过滤器

时间:2016-02-22 16:12:38

标签: javascript typescript lazy.js

我有一个数组,其中包含需要应用于Lazy.js中的项目数组的过滤器函数。我尝试过使用for循环,但只应用了最后一个过滤器。

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

1 个答案:

答案 0 :(得分:5)

您可以使用缩小来迭代过滤器,并通过将每个过滤器应用到上一个过滤器来创建结果过滤器。

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

reduce 只是一种更好,更通用的方法:

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

在您调用toArray或forEach之前,Lazy.js不会调用过滤器。我在this example中添加了一些日志。