Как цепочка из нескольких фильтров в 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();
}
Есть ли способ применить список фильтров без жесткого кодирования цепочки?
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