Как цепочка из нескольких фильтров в 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();
}


Есть ли способ применить список фильтров без жесткого кодирования цепочки?



Вот скрипка, показывающая проблему

601   1  

1 ответ:

Можно использовать reduce для перебора фильтров и создания результирующего фильтра, применяя каждый из них к предыдущему.

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

Вы можете найти обновленную скрипкуздесь .

Reduce - это просто более приятный и общий способ этого:

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

Ленивый.js не будет вызывать фильтры, пока вы не вызовете toArray или forEach. Я вставил несколько журналов в этот пример.

Comments

    Ничего не найдено.